如果以 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 如果您已经aria2c通过 Debian 运行 RC 脚本start-stop-daemon帮手,那么大部分任务已经帮你完成了;但你也必须提供--background--chdir /选择start-stop-daemon

相关内容