Ubuntu

init.d 腳本未在啟動時啟動

  • April 28, 2020

我有一個我認為很簡單的腳本,我想在啟動時執行它,但是我對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也擁有它們。

任何幫助都會非常有幫助。

執行“consumer &”只會將任務置於後台並繼續。如果擁有的 shell 終止,它將終止所有後台任務。您說腳本在命令行上工作,但如果您註銷,您的守護程序將無法生存?

你想用 start-stop-daemon 之類的東西來啟動你的守護程序。

編輯:實際上,再次閱讀您的文字時,我不確定消費者是否是守護程序?如果你只是想在啟動時執行一些程式碼(例如打掃房間),你可以在 /etc/rc.local 中寫一行。

如果該腳本需要很長時間才能執行,您可能想要放棄它。IE:

consumer &
disown %1

該腳本現在將在 shell 終止後繼續存在。請注意,如果 shell 輸出文本,它將保留相同的 tty,這可能會導致問題,這取決於它擁有的 shell 終止後發生的情況。

引用自:https://serverfault.com/questions/260717