我正在尝试在 rc.d/中创建一个文件,该文件将启动我编写的/bin/sh 脚本。我正在关注一些在这里找到的例子:
http://www.freebsd.org/doc/en/articles/rc-scripting/article.html#rc-flags
#!/bin/sh -x
# PROVIDE: copyfiles
. /etc/rc.subr
name=copyfiles
rcvar=copyfiles_enable
pidfile="/var/run/${name}.pid"
command="/var/etc/copy_dat_files.sh -f /var/etc/copydatafiles.conf"
command_args="&"
load_rc_config $name
run_rc_command "$1"
好像我的 pidfile 有问题。我的脚本是否需要是创建 pid 文件的脚本,还是会自动创建?我已经尝试了两种方法,无论是否让我的脚本创建一个 pid 文件,我都会收到一个错误,即 pid 文件不可读。
如果我的脚本应该制作它,制作 pid 文件的正确方法是什么?
谢谢
最佳答案
例如,查看现有的守护进程(例如/etc/rc.d/mountd)。然后查看/etc/rc.subr 中的子例程——那里有检查 PID 文件的代码,但没有创建它。
换句话说,您可以在守护程序启动脚本中声明 PID 文件是什么,但创建它取决于守护程序。说到守护进程,如果您的守护进程实际上是一个 shell 脚本,您可能希望使用 daemon(8) 实用程序。该实用程序将为您处理 PID 文件的创建。 (如果守护进程是用 C 编写的,你可以/应该使用 daemon(3) 函数。)
顺便说一句,在我看来,守护进程在打开用于创建的 PID 文件时,也应该锁定它们(使用 flock(3) 或 fcntl(2) 或 lockf(3))。这样,如果一个实例在没有删除 PID 文件的情况下崩溃(或被杀死),下一个实例将没有问题确定文件是陈旧的。
关于shell - 在 FreeBSD 中为 shell 脚本创建启动守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15646797/