プロセスに 10 秒以上かかる場合にシャットダウン時にスクリプトを実行するように upstart を構成するにはどうすればよいですか?

プロセスに 10 秒以上かかる場合にシャットダウン時にスクリプトを実行するように upstart を構成するにはどうすればよいですか?

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 rcrc (および通常はプロセスをシャットダウンするシグナル ターム) の前にタスクが実行されます。

ファイル: /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

より詳しい情報:

関連情報