我已经通过存储rc5.d的脚本文件运行二进制文件(用C语言编写)启动了一个服务守护进程 .
但我不知道如何捕获守护进程的pid并将其存储在/var/run/.pid中的pid文件中 . 这样我就可以使用pid进行终止 . 我怎样才能做到这一点?
尝试在init脚本中使用 start-stop-daemon(8) 和 --pidfile 参数 . 让程序将其PID写入指定位置(通常在配置文件中确定) .
start-stop-daemon(8)
--pidfile
您需要注意的是陈旧的PID文件,例如,如果锁定文件在重新启动时持续存在 . 该逻辑最好在init脚本本身中实现,因此 --exec 选项为 start-stop-daemon .
--exec
start-stop-daemon
例如,如果 /var/run/foo.pid 是 1234 ,并且 /proc/1234/exe 不是您的服务,则锁定文件是陈旧的,应该安静地删除,从而允许服务正常启动 .
/var/run/foo.pid
1234
/proc/1234/exe
就您的应用程序而言,只需确保lockfile的位置是可配置的,并且存在一些方法来告诉init脚本将其放在何处 .
例如:(示例:/ etc / default / foo):
PIDFILE=/var/run/foo.pid OTHEROPTION=foo
然后在/etc/init.d/foo中:
[ -f /etc/default/foo ] && . /etc/default/foo
同样,除了一致地写入文件之外,所有这些逻辑都应该在应用程序之外处理 .
如果您知道程序已打开的端口,请使用 fuser 命令确定pid .
fuser
你可以采取不止一种方式:
在您的程序中使用getpid将其写入可配置文件(可能在ENV中查找)
使用$!启动程序后(虽然这对我在archlinux上不起作用: - ?)
启动程序后,使用pidof
3 回答
尝试在init脚本中使用
start-stop-daemon(8)
和--pidfile
参数 . 让程序将其PID写入指定位置(通常在配置文件中确定) .您需要注意的是陈旧的PID文件,例如,如果锁定文件在重新启动时持续存在 . 该逻辑最好在init脚本本身中实现,因此
--exec
选项为start-stop-daemon
.例如,如果
/var/run/foo.pid
是1234
,并且/proc/1234/exe
不是您的服务,则锁定文件是陈旧的,应该安静地删除,从而允许服务正常启动 .就您的应用程序而言,只需确保lockfile的位置是可配置的,并且存在一些方法来告诉init脚本将其放在何处 .
例如:(示例:/ etc / default / foo):
然后在/etc/init.d/foo中:
同样,除了一致地写入文件之外,所有这些逻辑都应该在应用程序之外处理 .
如果您知道程序已打开的端口,请使用
fuser
命令确定pid .你可以采取不止一种方式:
在您的程序中使用getpid将其写入可配置文件(可能在ENV中查找)
使用$!启动程序后(虽然这对我在archlinux上不起作用: - ?)
启动程序后,使用pidof