當進程花費的時間超過 10 秒時,如何設定 upstart 在關機時執行腳本?

當進程花費的時間超過 10 秒時,如何設定 upstart 在關機時執行腳本?

我正在虛擬機器(VirtualBox)中運行 ubuntu 11.10,以了解有關 Linux 開發的更多資訊。我正在使用 git 儲存庫來保存我的工作,並編寫了一個腳本來捆綁我的工作並將其保存到共用資料夾,以便在虛擬機器未運行時使用。

我想在關閉之前自動執行此腳本,以便在虛擬機器關閉時我的工作始終可用(目前我必須手動執行該腳本)。

我不知道 upstart 是否是實現此目的的最佳方法,但這是我作為測試編寫的配置:

description     "test script to run at shutdown"

start on runlevel [056]

task

script
touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
end script

pre-start script
touch /media/sf_LinuxEducation/pre-start
sleep 15
touch /media/sf_LinuxEducation/pre-start-long
end script

post-start script
touch /media/sf_LinuxEducation/post-start
sleep 15
touch /media/sf_LinuxEducation/post-start-long
end script

pre-stop script
touch /media/sf_LinuxEducation/pre-stop
sleep 15
touch /media/sf_LinuxEducation/pre-stop-long
end script

post-stop script
touch /media/sf_LinuxEducation/post-stop
sleep 15
touch /media/sf_LinuxEducation/post-stop-long
end script

結果是僅完成一次觸控(預啟動中的第一次觸控)。我需要更改什麼才能在睡眠後看到其中一項觸摸才能工作?或者有沒有更簡單的方法來完成這個任務?

提前致謝。

答案1

新貴介紹、食譜和最佳實踐有大量程式碼片段可用於建立新貴任務和作業。

關機過程食譜的部分說/etc/init/rc.conf將運行並調用/etc/init.d/rc。反過來這最終會調用/etc/init.d/sendsigs.因此,如果您start on starting rc那麼您的任務將在 rc (以及通常會關閉進程的 sigterms)之前執行。

檔案:/etc/init/test.conf

description "test script to run at shutdown"

start on starting rc
task
exec /etc/init/test.sh

檔案:/etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long

答案2

我認為這不能透過暴發戶,作為/etc/init.d/sendsigs腳本,它被調用暴發戶停止/重新啟動時,會在 10 秒內殺死所有進程 ( killall5 -9),即使不成功,也會卸載所有內容並關閉。

最好的方法是使用生鏽的/etc/init.d樣式腳本。

例子:/etc/init.d/shutdown_job

#! /bin/sh
### BEGIN INIT INFO
# Provides:          shutdown_job
# Required-Start:    
# Required-Stop:     sendsigs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: bla
# Description: 
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
    date > /root/s.log
    sleep 20
    date >> /root/s.log
}

case "$1" in
  start)
    # No-op
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    do_stop
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac

:

然後啟動腳本

sudo update-rc.d shutdown_job start 19 0 6 .

這會將腳本放在發送訊號執行等級 0 到 6 上的腳本(關閉、重新啟動)。此範例腳本將記錄日期,然後休眠 20 秒,然後再次記錄日期/root/s.log.)

更多資訊:

相關內容