데스크탑 항목은 서비스를 중지하고, 응용 프로그램을 시작하고, 응용 프로그램이 닫힐 때 서비스를 다시 시작합니다.

데스크탑 항목은 서비스를 중지하고, 응용 프로그램을 시작하고, 응용 프로그램이 닫힐 때 서비스를 다시 시작합니다.

기본적으로 카메라를 열고 비디오 스트림에서 일부 작업을 수행하는 응용 프로그램(OS는 Ubuntu 16.04)이 있습니다. 시스템 서비스에 의해 관리됩니다.

[Unit]
Description=My Application
After=network.target
StartLimitInterval=0

[Service]
Type=simple
Restart=always
RestartSec=5
User=myuser
WorkingDirectory=/opt/foo/
ExecStart=/opt/foo/myapplication

[Install]
WantedBy=multi-user.target

그런 다음 데스크탑 항목이 있고 서비스를 중지하고 매개변수를 사용하여 애플리케이션을 다시 실행할 수 있습니다.

[Desktop Entry]
Name=Myapp
Type=Application
Exec=/opt/foo/launcher.sh
Terminal=true
Path=/opt/foo/
Categories=None;

이것은 내 실행기입니다:

#!/bin/bash
service myservice stop
/opt/foo/myapplication --debug

이 방법은 작동하지만 데스크톱 항목으로 시작된 응용 프로그램을 닫을 때 서비스를 다시 시작하는 방법을 찾을 수 없습니다. 런처 종료 시 서비스 재시작을 추가하려고 시도했지만 애플리케이션이 실행 중인 터미널을 닫으면 생각했던 모든 것이 종료되기 때문에 작동하지 않습니다. 어떻게 해야 합니까?

답변1

다음과 같은 유닛 파일을 작성할 수 있습니다 /etc/systemd/system/myprocess.service.

[Unit]
Description=My Process

[Service]
ExecStart=/bin/myprocess
Restart=always

[Install]
WantedBy=multi-user.target

그런 다음 데스크탑 포털에서 실행 프로그램을 만들어 수행하십시오.

systemctl start myprocess.service

그러나 실행 가능한 항목에서 수동으로 시작할 수 있도록 시작 시 서비스를 활성화하지 마십시오.
편집하다:
디버그 모드에서도 실행해야 하는 경우 --debug이 매개변수를 사용하여 다른 서비스 단위를 생성해야 합니다. 다음과 같은 스크립트를 가리키는 또 다른 데스크톱 항목을 만들 수 있습니다(대표적인 아이디어일 뿐임).

systemctl stop myprocess.service // to stop previous service
systemctl start processwithdebug.servce // to debug

답변2

첫 번째 장치 A를 사용 한다고 말하면 systemd에게 두 번째 장치 B에 대한 일부 작업을 수행하도록 요청할 수 있습니다. Conflicts그런 다음 B를 시작하면 A가 중지됩니다. 안타깝게도 B가 중지되면 A는 기본적으로 다시 시작되지 않지만 OnFailureB가 종료되지 않으면 A가 시작된다는 줄을 추가할 수 있습니다. B가 정상적으로 종료될 때 실패하도록 하려면 ExecStop반환 코드를 0이 아닌 값으로 설정하면 됩니다.

서비스:

[Service]
Type=simple
ExecStart=/opt/foo/myapplication

B. 서비스:

[Unit]
Conflicts=A.service
OnFailure=A.service
[Service]
Type=simple
ExecStart=/opt/foo/myapplication --debug
ExecStop=/usr/bin/false

답변3

잠금 파일을 사용하면 애플리케이션 인스턴스가 하나만 실행되도록 할 수 있습니다. systemctl stop myservice실행기에서 실행 하지 말고 systemctl restart myservice, 애플리케이션을 다시 시작해야 하는 후 5초 이내에 잠금 파일을 가져온 후 디버그 버전을 실행하세요.

systemctl restart myservice
flock /opt/foo/mylock /opt/foo/myapplication --debug

그리고 동일한 잠금을 사용하도록 유닛 파일을 변경합니다.

ExecStart=/usr/bin/flock /opt/foo/mylock /opt/foo/myapplication

5초 후에 다시 시작한 다음 잠금을 획득하고 애플리케이션을 실행하는 동안 이를 유지할 때까지 기다립니다. 잠금 파일은 어디에나 있을 수 있습니다. 실제로는 /opt/foo/myapplication잠금 파일로 사용할 수 있지만 다시 컴파일하거나 변경하면 잠금이 해제됩니다.

관련 정보