
Linux での開発についてさらに学ぶために、仮想マシン (VirtualBox) で Ubuntu 11.10 を実行しています。作業の保存には Git リポジトリを使用しており、仮想マシンが実行していないときに使用できるように作業をまとめて共有フォルダーに保存するスクリプトを作成しました。
シャットダウン前にこのスクリプトを自動的に実行して、VM がオフの場合でも作業が常に利用できるようにしたいと思います (現在はスクリプトを手動で実行する必要があります)。
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 回のタッチのみ (起動前の最初のタッチ) が実行されます。スリープ後のタッチの 1 つが機能するようにするには、何を変更する必要がありますか? または、これを実現するより簡単な方法はありますか?
前もって感謝します。
答え1
のUpstart の紹介、クックブック、ベスト プラクティスUpstart タスクやジョブの作成に使用できるコード スニペットが多数あります。
のシャットダウンプロセスクックブックの セクションでは、 が/etc/init/rc.conf
実行され、 が呼び出されると書かれています/etc/init.d/rc
。次に、 が最終的に を呼び出します/etc/init.d/sendsigs
。したがって、 を実行すると、start on starting rc
rc (および通常はプロセスをシャットダウンするシグナル ターム) の前にタスクが実行されます。
ファイル: /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
これは、成り上がり者、として送信元スクリプトは、成り上がり者停止/再起動時に、10 秒以内にすべてのプロセス ( killall5 -9
) を強制終了し、それが成功しない場合でもすべてをアンマウントしてシャットダウンします。
最良の方法は錆びた翻訳元スタイル スクリプト。
例:シャットダウンジョブ
#! /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。
より詳しい情報: