GUIアプリケーションを起動するためにSystemDによって呼び出されるBashスクリプト

GUIアプリケーションを起動するためにSystemDによって呼び出されるBashスクリプト

ここで何か間違っています。 SystemDがbashスクリプトを実行したいです。 bashスクリプトはGUIアプリケーションが実行されていることを確認し、そうでない場合はbashスクリプトはGUIアプリケーションを起動します。 GUI アプリケーションが実行中の場合、bash スクリプトは終了します。

bashスクリプトを手動で実行できますがsystemctl --user start make-run.shxtermチャテリノxtermほとんどの人がChatterinoを使用していないと仮定しているために変更しました。 Bashスクリプトは実行可能です。私のユニットファイルはにあります~/.config/systemd/user/。また、Type=oneshotユニットファイルで試しましたが、成功しませんでした。

バッシュスクリプト

#!/bin/bash
# ensure a process is always running

export DISPLAY=:0 # needed if running a gui app

process=xterm
makerun="/usr/bin/xterm"

if ps ax | grep -v grep | grep $process > /dev/null
then
    exit
else
    $makerun &
fi

exit

ユニットファイル

[Unit]
Description=Make run

[Service]
Environment="DISPLAY=:0"
ExecStart=/usr/bin/bash /home/ladlelord/bin/make-run.sh

[Install]
WantedBy=graphical.target

答え1

GAD3Rは近いですが、以下をお勧めします。

  1. DISPLAYまったく設定しないでください。バスは--userこれを暗黙的に設定します。まったく設定しないと、ディスプレイ設定を変更して最終的に別のモニターにログインしても機能し続けることができます。つまり、DISPLAYサービスとスクリプトからこれらの行を削除します。
  2. この[Install]セクションでは、graphical-session.targetこのユーザーのためのグラフィック環境を準備した後。一般的な不適切なエラーは次のとおりです。
    • graphical.targetシステムバスでのみ発生し、ログイン画面(GDMやlightdmなど)が表示されたときに発生します。 GUIユーザーアプリケーションを起動するには早すぎます。
    • multi-user.targetまた、システムバスでも発生し、誰でもログインできるようになるとすぐに発生します(SshまたはTTY経由の場合を含む)。もちろん、これはユーザーがログインしたり、グラフィカル環境を使用できるという保証がないため、不適切です。
    • default.targetユーザーバスにあるがSSHを介して(グラフィックセッションなしで)ログインすると、エラーが発生する可能性があります。場合によっては、サービスが失敗する可能性があります。
  3. xtermユーザーに関係なく実行中のインスタンスがない場合は、スクリプトが実行されます。これは多少不要になり、実際には何もせずにサービスをすぐに終了させることができます(サービスを開始するときに望むものではないかもしれません)。スクリプトを削除してExecStart=/usr/bin/xterm
  4. スクリプトを実際に保存するには、Type=forking代わりに暗黙の使用を検討してくださいType=simple。を実行すると起動してbash終了xtermします。のでType=simplebashそれは主なプロセスです。bash終了すると、systemd基本プロセスは終了とマークされ、サービスは完了(非アクティブ - 非アクティブ)と見なされる必要があります。次に、を含むすべての孤児プロセスをクリーンアップ(終了)しますxterm。基本プロセスとなる生成プロセスを明示的に定義するために使用できます。しかし、それがあなたがするすべてであれば、これはすべて不要です。Type=forkingsystemdPIDFile=ExecStart=/usr/bin/xterm

私の全体的な提案は次のとおりです(スクリプトを削除するとします)。

[Unit]
Description=Make run

[Service]
ExecStart=/usr/bin/xterm
Restart=on-failure

[Install]
WantedBy=graphical-session.target

または次のようになります(スクリプトを使用)。

[Unit]
Description=Make run

[Service]
ExecStart=/usr/bin/bash /home/ladlelord/bin/make-run.sh
Restart=on-failure
Type=forking

[Install]
WantedBy=graphical-session.target

答え2

Bashスクリプトでexport DISPLAY=:0次のように置き換えます。

export DISPLAY=:0.0

次のように編集されましたmake-run.sh.service

[Unit]

Description=Make run

[Service]
Environment="DISPLAY=:0"
ExecStart=/usr/bin/bash /home/ladlelord/bin/make-run.sh
Restart=on-failure
Type=forking

[Install]
WantedBy=graphical.target

それから:

systemctl --user daemon-reload
systemctl --user restart make-run.sh.service

編集する

graphical.target 次の状況に応じてより適しています。@スチュアート 提案

関連情報