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

标签 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 文件的正确方法是什么?

谢谢

最佳答案

例如,查看现有的守护进程(例如/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/

相关文章:

linux - 如何压缩目录中大于一定大小的文件?

windows - 将环境变量值与命令行中的字符串连接起来

c - FreeBSD 系统调用比 Linux 破坏更多的寄存器?内联汇编优化级别之间的不同行为

networking - netstat中的 "broadcast/multicast datagrams undelivered"表示什么?

php上传文件错误代码3

shell - PowerShell 命令行上的链命令(如 POSIX sh &&)

string - Heredoc 中的 Concat 变量

shell - 并行执行多个子Shell脚本的错误处理

linux - 命令和系统调用名称后的数字在 *nix 中是什么意思?

unix - 确定监听某个端口的进程pid