デフォルトでは、カメラを開き、ビデオストリームでいくつかのタスクを実行するアプリケーション(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に2番目のデバイスBに対していくつかのタスクを実行するように要求できます。Conflicts
その後、Bを起動するとAが停止します。残念ながら、Bが停止した場合、Aはデフォルトでは再起動されませんが、OnFailure
Bが終了しないとAが起動する行を追加できます。 Bが正常に終了したときに失敗するようにするには、ExecStop
戻りコードをゼロ以外の値に設定します。
サービス:
[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
ロックファイルを使用すると、アプリケーションインスタンスを1つだけ実行できるようになります。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
ロックファイルとして使用できますが、再コンパイルまたは変更するとロックが解除されます。