有没有简单的方法来创建FreeBSD rc脚本?


9

我在FreeBSD监狱里使用命令运行服务器:

/usr/sbin/daemon /path/to/script.py

此刻,我必须在每次重新启动机器并启动监狱时都运行此命令。我希望此命令从开始/etc/rc。有没有一种简单的方法可以为daemon命令创建FreeBSD rc脚本?


更新:我通读了有关rc脚本的BSD文档,并从中创建了以下脚本/etc/rc.d/pytivo

#!/bin/sh

. /etc/rc.subr

name=pytivo
rcvar=pytivo_enable
procname="/usr/local/pytivo/pyTivo.py"

command="/usr/sbin/daemon -u jnet $procname"

load_rc_config $name
run_rc_command "$1"

这可以在监狱开始时启动我想要作为守护程序的python脚本...(给定pytivo_enable="YES"/etc/rc.conf),但是rc脚本不知道守护程序是否正在运行(它认为不是在何时运行),并且当我尝试启动它时会给出警告:

[root@meryl /home/jnet]# /etc/rc.d/pytivo start
[: /usr/sbin/daemon: unexpected operator
Starting pytivo.
[root@meryl /home/jnet]# 

因此它很接近,并且可以工作,但是我觉得我应该能够获得比这更好的功能。


您需要将此脚本放在某个地方(现在不记得了),并XX_enable="YES"在/etc/rc.conf中放置一行以使其自动启动。首先查找现有脚本
雏菊

我正在寻找一种创建脚本的简单方法...是否可以复制和重用一个好的脚本?
2012年

Answers:


11

command不应包含多个单词。这是[您看到错误的原因。您应该分别设置任何标志。

另外,您应该使用pytivo_user来设置运行的uid,而不是daemon -u。有关所有这些魔术变量,请参见rc.subr(8)手册页。

另外,您应该让rc子系统知道pytivo是一个Python脚本,以便它在检查进程是否运行时可以找到该进程。

最后,您应该将惯用法set_rcvar用于rcvar

这样的事情(我不确定这是正确的Python路径):

#!/bin/sh

# REQUIRE: LOGIN

. /etc/rc.subr

name=pytivo
rcvar=`set_rcvar`
command=/usr/local/pytivo/pyTivo.py
command_interpreter=/usr/local/bin/python
pytivo_user=jnet
start_cmd="/usr/sbin/daemon -u $pytivo_user $command"

load_rc_config $name
run_rc_command "$1"

问题是usr/local/pytivo/pyTivo.py 不会守护进程,因此/usr/bin/daemon在运行时不调用它就只会使命令在前台运行/etc/rc.d/pytivo start
Josh

但是,这确实可以纠正statusstop命令!
2012年

哦,脚本不守护吗?我认为最简单的解决方法是start_cmd在致电之前设置load_rc_configstart_cmd="/usr/sbin/daemon -u $pytivo_user $command"
aecolley

这具有使脚本运行所需的魔力。谢谢!
Dave Martorana

0

如果不需要rc脚本,则可以只使用/etc/rc.local。

对于您的rc脚本,您缺少依赖注释,至少一行

# REQUIRE: LOGIN

应该会在正确的时间运行。

您可能还需要定义一个pidfile

pytivo_pidfile="/path/to/your/pidfile"

我希望这会有所帮助,但没有帮助。我仍然得到: /usr/sbin/daemon: unexpected operator,我的rc脚本仍然不知道该脚本是否正在实际运行。
2012年

你可以尝试调用脚本-x看看哪些命令失败
arved
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.