使用システム:

使用システム:

私がよくやりたいことの1つは、権限のないユーザーとして長期実行プロセスまたはサーバーを起動し、それがまだ実行中であることを確認し、そうでなければ再起動する方法を持つことです。

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

答え1

使用システム:

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. お楽しみください!

答え2

deamontoolsあなたはそれがユーザーとして素晴らしい仕事をしていると言いました。バラよりhttps://cr.yp.to/daemontools/supervise.html

アップデート - ソリューション

上記の提案に基づいて、OPはsvscan2つの異なるアプローチを試みた後、このプログラムを使用してこれを実行しました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

サーバーがsystemdを実行している場合は、systemd --user start myserviceサービスファイルを~/.config/systemd/user/

設定するとRestartサービスオプションに応じて、systemdはサービスの終了時に他の設定オプションを使用してサービスを自動的に再起動します。

システムに依存しない他のオプションを有効にすることもできますscreen。を呼び出すと、screenセッションが存在するかどうかを確認できscreen -list、必要に応じて開始(分離)できます。 . "remote"を使って画面からコマンドを実行できますscreen -S "$screen_session" -X stuff 'command\n'。その後、その画面セッションの背景からプログラムを起動し、変数のPIDを覚えておいてください。

cron ジョブは screenstuffコマンドを使用してプロセスがまだ実行中であることを確認し、それ以外の場合は再起動します。

答え4

Debian システムでは、以下を使用できます。start-stop-daemoninitスクリプトの使用方法に似ています。デーモン(デュアルフォーク)と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

関連情報