繁体   English   中英

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

[英]Creating a startup daemon for a shell script in 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文件的正确方法是什么?

谢谢

例如,查看现有的守护程序(例如/etc/rc.d/mountd)。 然后查看/etc/rc.subr中的子例程-那里有代码可以检查PID文件,但是什么也没有创建。

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

BTW,在我看来,守护进程在打开用于创建的PID文件时,也应该锁定它们(使用flock(3)或fcntl(2)或lockf(3))。 这样,如果一个实例崩溃了(或被杀死)而没有删除PID文件,则下一个实例将毫无问题地确定该文件是陈旧的。

通常,守护程序应该创建并清理自己的PID文件。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM