我正在尝试在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文件的正确方法是什么?
由于
答案 0 :(得分:4)
查看现有的守护进程(例如/etc/rc.d/mountd)。然后查看/etc/rc.subr中的子程序 - 那里有代码来检查PID文件,但没有任何东西创建它。
换句话说,您可以在守护程序启动脚本中声明PID文件是什么,但创建它取决于守护程序。说到守护进程,你可能希望使用守护进程(8)实用程序,如果你的守护进程实际上是一个shell脚本。该实用程序将为您创建PID文件。 (如果守护程序是用C语言编写的,则可以/应该使用守护进程(3)函数。)
BTW,在我看来,守护进程在打开用于创建的PID文件时,还应该锁定它们(使用flock(3)或fcntl(2)或lockf(3)) 。这样,如果一个实例在没有删除PID文件的情况下崩溃(或被杀死),下一个实例将没有问题确定,该文件是陈旧的。答案 1 :(得分:3)
通常,守护进程应该创建并清理自己的PID文件。
从shell脚本中,您可以提供以下命令来创建它;
echo $$ >/var/run/${name}.pid
在退出脚本之前不要忘记删除文件。编写一个cleanup()
函数来执行该操作,并在发生某些信号时让trap
调用该函数。也可以在退出脚本之前调用cleanup。