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