我目前在 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
我否认您所提到的下载程序守护进程有任何经验,但是......
- RC脚本是你自己写的吗?
aria2c
跑步时是否能正确停下来/etc/init.d/aria2 stop
?(即不留下挥之不去的进程?)
如果 (1) 为“是”,(2) 为“否”,则可能是因为aria2c
催生一个孩子去做真正的工作,并且您没有在 RC 脚本中正确抑制它。
许多程序都有一个守护进程您调用的程序将生成一个子程序的模式,并且守护进程:
- 该程序将派生一个子进程。
- 子进程将工作目录更改为
/
. - 子进程切断自己的标准输入/输出/错误。
- 子进程将其自身从当前会话中分离出来。
- 父进程(您调用的)终止。
- 子进程留在后台做真正的工作。
您在 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
。