启动/重启后在 FreeBSD 中运行脚本

Pac*_*rsh 5 cron freebsd sh rc

我有一个简单的脚本:

#!/bin/sh

PROVIDE: test
REQUIRE: LOGIN NETWORKING

. /etc/rc.subr

name="test"
load_rc_config $name

rcvar=test_enable

cd /home/deploy/projects/test
/usr/sbin/daemon -u deploy /usr/local/bin/node /home/deploy/projects/test/server.js

run_rc_command "$1"
Run Code Online (Sandbox Code Playgroud)

里面/usr/local/etc/rc.d。它是可执行的。它被注册到 /etc/rc.conf

我需要它在启动/重启后启动。我设法使用 Cron 做到了

@reboot
Run Code Online (Sandbox Code Playgroud)

但它看起来不合法。在启动/重新启动后自动运行该脚本的正确方法是什么?

Mat*_*ski 5

首先,官方文档中有一篇文章解释了如何编写rc脚本:Practical rc.d scripting in BSD。

它可能会回答你的大部分问题。

当涉及到您的脚本时:

  1. 像PROVIDE,REQUIRE等关键字必须是注释。有关更多详细信息,请参阅rc(8) 手册页和rcorder(8) 手册页。

    #!/bin/sh
    #
    # PROVIDE: test
    # REQUIRE: LOGIN NETWORKING
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我认为您也错过了设置test_enable为默认值的机会。

    : "${test_enable:="NO"}"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您真的不想将启动守护程序的指令放在脚本的全局范围内。这部分代码很糟糕:

    cd /home/deploy/projects/test
    /usr/sbin/daemon -u deploy /usr/local/bin/node /home/deploy/projects/test/server.js
    
    Run Code Online (Sandbox Code Playgroud)

    您应该尝试定义一个start_cmd函数(argument_cmd在rc.subr(8) 手册页中查找更多信息)或定义command变量。


总而言之,最好的想法是查看其他脚本/etc/rc.d并/usr/local/etc/rc.d了解人们如何编写这些脚本以及标准是什么。这是我最近在为 Keybase 文件系统 (KBFS) 开发守护进程时学到的。你可以在这里查看代码。

联机帮助页也很有帮助。从rc(8) 开始,然后查看SEE ALSO部分中列出的其他手册。