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

Jos*_*osh 9 startup freebsd jails shell-script daemon

我有一个 FreeBSD jail,我在其中使用以下命令运行服务器:

/usr/sbin/daemon /path/to/script.py
Run Code Online (Sandbox Code Playgroud)

目前,每次我重新启动机器和监狱启动时,我都必须运行这个命令。我想让这个命令从/etc/rc. 有没有一种简单的方法可以为daemon命令创建 FreeBSD rc 脚本?


更新:我通读了有关 rc scripts 的 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"
Run Code Online (Sandbox Code Playgroud)

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

[root@meryl /home/jnet]# /etc/rc.d/pytivo start
[: /usr/sbin/daemon: unexpected operator
Starting pytivo.
[root@meryl /home/jnet]# 
Run Code Online (Sandbox Code Playgroud)

所以它很接近,并且有效,但我觉得我应该能够获得比这更好的功能。

aec*_*ley 11

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

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

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

最后,您应该使用惯用语set_rcvarfor 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"
Run Code Online (Sandbox Code Playgroud)