私が頻繁にやりたいことは、長時間実行されているプロセスまたはサーバーを自分の非特権ユーザーとして起動し、それがまだ実行されているかどうかを確認し、実行されていない場合は再起動する方法があることです。
たとえば、頻繁に実行されるcronジョブを設定して、プロセスが実行されているかどうかを確認し、プロセスがクラッシュした場合は再起動することがあります。これは、djbのdaemontools、supervisord、launchdなどのプロセス管理ツールの本質です。ただし、これらのツールは、デフォルトで/etc
の構成ファイルを使用してrootとして実行するように構成されていますが、同じことを実行できるユーティリティが必要です。私のホームディレクトリの快適さからの私の非特権ユーザーのようなもの。
deamontools
あなたはユーザーとして問題なく動作すると述べました。 https://cr.yp.to/daemontools/supervise.html を参照してください
上記の提案に従って、OPは2つの異なる方法を試した後、svscan
からdaemontools
プログラムを使用してこれを機能させました。
@reboot /usr/bin/svscan $HOME/.local/service 2>&1 > $HOME/.local/service/log
~/.config/autostart/svscan.desktop
とともに Exec=...
ラッパースクリプトを使用してsvscan
を起動するように設定された行。私のラッパースクリプトは次のようになります。
#!/usr/bin/env sh
(
echo "Starting svscan."
date
/usr/bin/svscan $HOME/.local/service 2>&1
) >> $HOME/.local/service/log
どちらの方法も機能しますが、それぞれが異なる状況に適しています。最初の方法は、非特権ユーザーが独自の長時間実行サービスとプロセスをインストールできるようにするヘッドレスマシンで実行する場合に適しています。 2番目の方法は、現在ログインしているXユーザーの環境やssh-agentなどをすべてのサービスに継承させたい場合に適しています。つまり、プロセスは、現在ログインしているユーザー自身のプロキシになります。
〜/ .config/systemd/user/<service_name> .service
[Unit]
Description=<Write some description here>
[Service]
ExecStart=<Write some command here>
Restart=always
[Install]
WantedBy=graphical.target
見る - man systemd.service
および man systemd.unit
その他のオプション。
$ systemctl --user enable <service_name>
$ systemctl --user start <service_name>
$ systemctl --user status <service_name>
これで、PCをリロードしてグラフィカル環境にログインし、サービスステータスを再度確認できます。
サーバーがsystemdを実行している場合は、systemd --user start myservice
を使用してユーザースペースでサービスを実行できます。サービスファイルは~/.config/systemd/user/
に配置する必要があります。
そのサービスの Restart
オプションを構成すると、systemdは終了時にそのサービスを自動的に再起動します(さまざまな構成オプションを使用)。
Systemdに依存しない別のオプションは、screen
を開始することです。 screen -list
を呼び出すことで画面セッションが存在するかどうかを確認し、必要に応じて開始(切り離し)できます。 screen -S "$screen_session" -X stuff 'command\n'
を使用すると、画面内でコマンドを「リモート」で実行できます。次に、その画面セッションでバックグラウンドでプログラムを起動し、変数にPIDを記憶します。
Cronジョブは、screenのstuff
コマンドを使用して、プロセスがまだ実行されているかどうかを確認し、そうでない場合は再起動します。
Debianシステムでは、initスクリプトで使用されるのと同様の方法で start-stop-daemon
を使用できます。デーモン化(ダブルフォーク)およびPIDの保存には、追加の特権は必要ありません(ただし、それらを必要とするオプションを使用しようとすると、非特権ユーザーとしてプログラムを実行すると失敗します)。
長時間実行プロセスを開始するには:
/sbin/start-stop-daemon --start --pidfile /path/to/pidfile --make-pidfile \
--background --exec /path/to/executable -- options
ステータスを確認します。
/sbin/start-stop-daemon --status --pidfile /path/to/pidfile
プロセスを停止します。
/sbin/start-stop-daemon --stop --pidfile /path/to/pidfile