web-dev-qa-db-ja.com

プロセスに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つを表示するには、何を変更する必要がありますか?または、これを達成する簡単な方法はありますか?

前もって感謝します。

11
Tiris

pstart Intro、Cookbook、Best Practices には、Upstartのタスクとジョブの作成に使用する多数のコードスニペットがあります。

クックブックの shutdown process セクションは、/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
7
overprescribed

upstartを介してこれを行うことはできないと思います。/ etc/init.d/sendsigsスクリプトとして、停止/再起動時にupstartによって呼び出され、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 a 6(シャットダウン、再起動)のsendsigsスクリプトの前にスクリプトが配置されます。このサンプルスクリプトは、日付を記録してから20秒間スリープし、再度/ root/s.logに日付を記録します。

詳細:

7
arrange