在FreeBSD中为shell脚本创建启动守护进程

时间:2013-03-26 20:30:42

标签: shell freebsd

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

由于

2 个答案:

答案 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。