运行 boot/reboot 之后的 FreeBSD 脚本

Running a script in FreeBSD after boot/reboot

我有一个简单的脚本:

#!/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 ""

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

我需要它在 boot/reboot 之后启动。我设法通过 Cron 使用

做到了
@reboot

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

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

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

关于您的脚本:

  1. PROVIDEREQUIRE等关键字必须是评论。有关详细信息,请参阅 rc(8) manual page and the rcorder(8) manual page

    #!/bin/sh
    #
    # PROVIDE: test
    # REQUIRE: LOGIN NETWORKING
    
  2. 我想你也想念将 test_enable 设置为默认值的问题。

    : "${test_enable:="NO"}"
    
  3. 您真的不想将启动守护程序的指令放在脚本的全局范围内。您的这部分代码有问题:

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

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


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

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