我有一个 FreeBSD 监狱,我在其中使用以下命令运行服务器:
/usr/sbin/daemon /path/to/script.py
目前我每次重新启动机器并且监狱启动时都必须运行此命令。我想让这个命令从 开始/etc/rc
。有没有一种简单的方法来为命令创建 FreeBSD rc 脚本daemon
?
更新:我通读了这个关于 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]#
所以就是关闭,和它作品,但我觉得我应该能够获得比这更好的功能。
答案1
command
不应包含多个单词。这就是您看到的错误的原因[
。您应该单独设置任何标志。
另外,您应该使用pytivo_user
来设置正在运行的 uid,而不是daemon -u
.请参阅rc.subr(8)所有这些神奇变量的手册页。
另外,您应该让 rc 子系统知道 pytivo 是一个 Python 脚本,以便它在检查进程是否正在运行时可以找到该进程。
最后,您应该使用惯用语set_rcvar
for 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"
答案2
如果您不需要 rc 脚本,则可以仅使用 /etc/rc.local。
对于您的 rc 脚本,您缺少依赖注释,至少一行
# REQUIRE: LOGIN
应该有帮助,它在正确的时间运行。
您可能还需要定义一个 pidfile
pytivo_pidfile="/path/to/your/pidfile"