
我正在虛擬機器(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.)
更多資訊: