デスクトップエントリはサービスを停止し、アプリケーションを起動し、アプリケーションが閉じたときにサービスを再起動します。

デスクトップエントリはサービスを停止し、アプリケーションを起動し、アプリケーションが閉じたときにサービスを再起動します。

デフォルトでは、カメラを開き、ビデオストリームでいくつかのタスクを実行するアプリケーション(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はデフォルトでは再起動されませんが、OnFailureBが終了しないと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ロックファイルとして使用できますが、再コンパイルまたは変更するとロックが解除されます。

関連情報