4

我正在尝试在 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 文件的正确方法是什么?

谢谢

4

2 回答 2

4

例如,查看现有的守护进程(例如 /etc/rc.d/mountd)。然后查看 /etc/rc.subr 中的子例程——那里有检查 PID 文件的代码,但没有创建它。

换句话说,您可以在守护进程启动脚本中声明 PID 文件是什么,但创建它取决于守护进程。说到守护进程,如果您的守护进程实际上是一个 shell 脚本,您可能希望使用 daemon(8) 实用程序。该实用程序将为您创建 PID 文件。(如果守护程序是用 C 编写的,您可以/应该使用 daemon(3) 函数。)

顺便说一句,在我自己看来,守护进程在打开 PID 文件进行创建时,也应该锁定它们(使用flock(3) 或 fcntl(2) 或 lockf(3))。这样,如果一个实例在没有删除 PID 文件的情况下崩溃(或被杀死),那么下一个实例将没有问题确定该文件是陈旧的。

于 2013-04-10T22:18:09.250 回答
3

一般来说,一个守护进程应该创建和清理它自己的 PID 文件。

从 shell 脚本中,您可以使用以下命令来创建它;

echo $$ >/var/run/${name}.pid

不要忘记在退出脚本之前删除文件。编写一个执行此操作的cleanup()函数,并trap在某些信号发生时调用该函数。还要在退出脚本之前调用 cleanup。

于 2013-04-01T18:56:33.757 回答