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


11

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

前もって感謝します。

回答:


7

成り上がりイントロ、クックブックやベストプラクティスは新興タスクとジョブの作成に使用するコードスニペットを多数持っています。

クックブックのシャットダウンプロセスセクションには、それ/etc/init/rc.confが実行され、呼び出されることが示されています/etc/init.d/rc。順番にこれは最終的に呼び出します/etc/init.d/sendsigs。したがって、start on starting rcrc(および通常はプロセスをシャットダウンするsigterm)の前にタスクが実行されます。

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

1
この質問に具体的な例を追加しましたが、「イベントエイリアスの作成」のドキュメントに記載があるにもかかわらず、機能しません(シャットダウン時に最初のタッチのみが実行されます)。エラーを確認してください。
ティリス

ティリス、これはうまくいくはずです。再起動後に/ var / log / syslogを確認することに興味があります。特に、テストのプロセスがupstartによって強制的に強制終了されたかどうかを確認します。
SpamapS

1
この回答の最新の編集は機能します。変更履歴を確認して、問題のある子を確認します。編集したことをコメントするべきだったと思います(または、コメントを削除して新しいコメントを追加する方が適切ですか?スタック交換のエチケットはありますか?)問題の子が機能しない理由を知ることに興味があります(ドキュメントにはそれがあるべきだと書かれているため)。
ティリス

test.confファイルの正確な意味は何ですか?test.confというファイルを作成しますか、それともrc.confに追加しますか?
heneryville

@heneryville test.confはランダムなファイル名です。簡単に使用できますwhatEverYouWant.conf。あなたのコメントは、あなたが答えで言及された「料理本」を読んでいなかったことも示しています。セクション4.2を見ると、ジョブ設定ファイルの詳細が説明されています。
ティリス

7

私はこれを介して行うことができないと思います成り上がりとして、/etc/init.d/sendsigsのによって呼び出されるスクリプト、成り上がりの停止/再起動するときは、(すべてのプロセスを強制終了しkillall5 -9、それが行く、10秒以内)、およびそれが成功しない場合でも、すべてをアンマウントしてシャットダウンします。

最良の方法は、さびた/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(シャットダウン、再起動)のsendigsスクリプトの前にスクリプトが配置されます。このサンプルスクリプトは、日付を記録し、20 秒間スリープし、再度日付を/root/s.logに記録します。

より詳しい情報:


私はこの種のことをするのにまったく慣れていません。これを機能させるための良いガイドはありますか?詳細を編集してください。
ティリス

私はこれを試してみましたが、うまくいきません(正確にはできません)。私が追加touch /media/sf_LinuxEducation/starttouch /media/sf_LinuxEducation/start-long日付コマンドに次の権利を。日付は記録されますが、タッチはタッチされません。これにより、スクリプトの実行時にそのドライブがマウント解除されているのではないかと思うようになります。NNの議論と関係があるのではないかと思いますが、この議論が実際にどのように機能するのかは確かではありません(manページでは非常に心を曲げる方法で説明しています)。この引数に設定する数値(または数値のペア)をどのように知るのですか?
ティリス

スクリプトは、/etc/rc6.dディレクトリをリストしたときに表示される番号に従って実行されます。したがって、19のシャットダウンスクリプトは、アンマウントが完了する前に実行されている必要があります(> 31)。しかし、あなたの仮説を試して、/root代わりにファイルに触れてみませんか?
手配

dirを/etc/rc6.d調べると、共有フォルダーがK70vboxaddスクリプトでマウント/アンマウントされていることがわかります。(私のスクリプトの)NN引数を71に変更すると、VB共有フォルダーのアンマウント前にスクリプトが実行されますか?今日は後で試してみます。
ティリス

それはうまくいきませんでした。更新:コマンドのtouch /root/start前にを追加しましたが、sleep 20ファイルは作成されません。私はどこでその理由を見つけ始めるのかさえ知りません。日付は/root/s.logファイルに喜んで追加されます。なぜファイルに触れないのですか?
ティリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.