init.dで始まると、PIDは異なります。

init.dで始まると、PIDは異なります。

私は現在Debian 10マシンで小規模サーバーとして実行しています。 aria2cをインストールしてダウンロードサービスとして使用しています。これまでは、すべてが大丈夫でしょう。私の質問は次のとおりです

  • init.dスクリプトを使用してaria2cをデーモンとして起動します。
  • pidファイルが作成されます。
  • プロセスを確認すると、aria2cのPIDはファイルのPIDとは異なります。

誰かが理由を説明できますか? (注 - これは機能上の問題ではありません。理由を知りたいのですが、私が何か間違っているのかもしれません...)

$ cat /var/run/aria2c.pid
561
$ sudo /etc/init.d/aria2 status
...
CGroup: /system.slice/aria2.service
       └─565 /usr/bin/aria2c --daemon=true --enable-rpc --conf-path=/etc/aria2.conf
$ pgrep aria2
565
$ ps ax | grep aria*
  565 ?        Ss     0:36 /usr/bin/aria2c --daemon=true --enable-rpc --conf-path=/etc/aria2.conf
$ cat /proc/56
56/  565/ 

これが私に意味するのは、プロセス561がもう存在しないということです。しかし、なぜ私のpidファイルにこのPIDがあるのですか?

答え1

私はあなたが言及したダウンローダデーモンの経験を否定していますが...

  1. RCスクリプトを自分で書いていますか?
  2. aria2c走るとちゃんと止まりますか/etc/init.d/aria2 stop(つまり、遅いプロセスが残っていませんか?)

(1)が「はい」で、(2)が「いいえ」の場合、次の理由が考えられます。aria2c本物の仕事ができる子供を産む、RCスクリプトはこれを正しく抑制していません。

多くのプログラムでは悪魔呼び出されたプログラムはサブルーチンのパターンを生成し、悪魔:

  1. このプログラムは子プロセスを分岐します。
  2. サブプロセスは作業ディレクトリを/
  3. サブプロセスは独自の標準入力/出力/エラーをブロックします。
  4. 子プロセスは現在のセッションから切り離されます。
  5. あなたが呼び出した親プロセスは終了します。
  6. 子プロセスは、実際のタスクを実行するためにバックグラウンドで維持されます。

PIDファイルにキャプチャしたプロセスIDは、おそらく終了した親プロセスです。

デーモン()を停止すると、PIDファイルのプロセスIDも使用されます/etc/init.d/aria2 stop。無効な場合(たとえば、実際のデーモンの代わりに終了した親プロセスを参照)、その結果デーモンは停止せず、手動で終了する必要があります。

aria2cソリューションを実行する必要はありません。--daemon範囲、自己デーモン化を防ぐために(正しいプロセスIDをPIDファイルに保存できるように)、次のことを行う必要があります。悪魔RCスクリプトに直接参加してみてください。

PSすでにaria2cDebian経由でRCスクリプトを実行している場合start-stop-daemonヘルパー、それでほとんどの作業が完了しました。しかし、あなたも提案--backgroundして--chdir /選択する必要がありますstart-stop-daemon

関連情報