web-dev-qa-db-ja.com

非特権ユーザーとしてプロセスをデーモン化するためのユーティリティはありますか?

私が頻繁にやりたいことは、長時間実行されているプロセスまたはサーバーを自分の非特権ユーザーとして起動し、それがまだ実行されているかどうかを確認し、実行されていない場合は再起動する方法があることです。

たとえば、頻繁に実行されるcronジョブを設定して、プロセスが実行されているかどうかを確認し、プロセスがクラッシュした場合は再起動することがあります。これは、djbのdaemontools、supervisord、launchdなどのプロセス管理ツールの本質です。ただし、これらのツールは、デフォルトで/etcの構成ファイルを使用してrootとして実行するように構成されていますが、同じことを実行できるユーティリティが必要です。私のホームディレクトリの快適さからの私の非特権ユーザーのようなもの。

6
Chris McCormick

deamontoolsあなたはユーザーとして問題なく動作すると述べました。 https://cr.yp.to/daemontools/supervise.html を参照してください

更新-ソリューション

上記の提案に従って、OPは2つの異なる方法を試した後、svscanからdaemontoolsプログラムを使用してこれを機能させました。

  1. このように最新のcrontabに入れてください:@reboot /usr/bin/svscan $HOME/.local/service 2>&1 > $HOME/.local/service/log
  2. ~/.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などをすべてのサービスに継承させたい場合に適しています。つまり、プロセスは、現在ログインしているユーザー自身のプロキシになります。

3
Matija Nalis

systemdの使用:

1.サービスユニット構成ファイルを作成します

〜/ .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 その他のオプション。

2.ユーザースペースでサービスを有効にする

$ systemctl --user enable <service_name>

3.すぐに起動して、ステータスを確認します

$ systemctl --user start <service_name>
$ systemctl --user status <service_name>

4.自動的に起動することを確認します

これで、PCをリロードしてグラフィカル環境にログインし、サービスステータスを再度確認できます。

5.お楽しみください!

3
raacer

サーバーが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コマンドを使用して、プロセスがまだ実行されているかどうかを確認し、そうでない場合は再起動します。

2
Martin Nyolt

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
1
sebasth