init.d 脚本未在启动时启动

init.d 脚本未在启动时启动

我有一个我认为非常简单的脚本,我想在启动时运行它,但是我对init.d脚本还很陌生,也许一般有更好的方法来做到这一点。

基本上我希望我的脚本在系统启动时运行,所以我有一个 ruby​​ 脚本,我已将其移至/usr/bin,并将其命名为consumer

为了简洁起见,它看起来像这样,但实际上做了一些事情:

#!/usr/bin/env ruby

# just example code
puts "do stuff"

然后我将我的init.d脚本放入/etc/init.d并命名为consumer

#!/bin/bash
### BEGIN INIT INFO
# Provides:          consumer
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INF

# /etc/init.d/consumer
#

# Some things that run always
touch /var/lock/consumer

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting Consumer"
    consumer &
    echo "Consumer started successfully."
    ;;
  stop)
    echo "Stopping Consumer"
    echo "Nothing happened..."
    ;;
  *)
    echo "Usage: /etc/init.d/consumer {start|stop}"
    exit 1
    ;;
esac

exit 0

现在,如果我保存此文件并运行sudo /etc/init.d/consumer start,它就会完美运行!它会启动并给出所需的输出。然后我运行:

$ sudo update-rc.d consumer defaults
Adding system startup for /etc/init.d/consumer ...
  /etc/rc0.d/K20consumer -> ../init.d/consumer
  /etc/rc1.d/K20consumer -> ../init.d/consumer
  /etc/rc6.d/K20consumer -> ../init.d/consumer
  /etc/rc2.d/S20consumer -> ../init.d/consumer
  /etc/rc3.d/S20consumer -> ../init.d/consumer
  /etc/rc4.d/S20consumer -> ../init.d/consumer
  /etc/rc5.d/S20consumer -> ../init.d/consumer

但是当重新启动系统时,我的脚本从未启动,有什么想法吗?我不确定下一步该怎么做。我已将所有脚本权限调整为775,并确保root也拥有它们。

任何帮助都会非常有帮助。

答案1

执行“consumer &”只会将任务置于后台并继续执行。如果所属 shell 终止,它将终止所有后台任务。您说该脚本在命令行上运行,但如果您注销,您的守护进程将无法继续运行?

您想使用类似 start-stop-daemon 的命令来启动您的守护进程。

编辑:实际上,再次阅读您的文本时,我不确定消费者是否是守护进程?如果您只想在启动时运行一些代码(例如,房屋清洁),您可以在 /etc/rc.local 中写入一行。

如果脚本运行时间过长,您可能想放弃它。例如:

consumer &
disown %1

现在脚本将在 shell 终止后继续存在。但请注意,如果 shell 输出文本,它将保留相同的 tty,这可能会导致问题,具体取决于其所属 shell 终止后发生的情况。

答案2

尝试指定 的完整路径consumer。我怀疑它不在默认路径中,因此无法执行。

答案3

如果你正在使用 Ubuntu,请尝试使用以下命令:

http://manpages.ubuntu.com/manpages/hardy/man8/update-rc.d.8.html

答案4

只需使用:

sudo systemctl enable consumer.service

启用

sudo systemctl disable consumer.service

禁用

如果你的脚本符合 LSB 规范,那么就可以正常工作。-

相关内容