web-dev-qa-db-ja.com

Linuxブート中のスクリプト:ブートが「完了」したときをテストする方法は?

Debianサーバーでの起動中に実行されるスクリプトがあります。実行が早すぎますが、いつ発射されるかを制御できません。次の方法で、スクリプトに自身の実行を遅らせることができます。

sleep 60

...または、次のように、アクションを数回試すこともできます。

TESTRUN=0
ACTIONWORKED=0
while [ $ACTIONWORKED -eq 0 ] && [ $TESTRUN -le 5 ]; do
      # run the action i want
      # quick test if it worked
      # if yes, set ACTIONWORKED=1
      # if no, sleep 10
      # increment TESTRUN
done

システムの準備ができていることをテストするためのより良い方法は何ですか?スクリプトはシステム操作中の他の時間に実行されるため、テストは"booting-ca n't- do-this-yet "および" not-booting-run-now "状態。スクリプトが実行されるたびに待機させたくありません。


編集:これまでのアイデアに感謝します。すでに投稿されているものに代わるものがある場合は、今後も続けてください。

詳細を尋ねた人には、一般的なLinuxブートプロセスで機能する回答を収集するために、特に質問から除外しました。

「完全に起動した」システムが(コンソール、Xなどを介して)ログインプロンプトを表示したと仮定します。

4
quack quixote

あなたが望むことをするための本当に最良の方法は、SysVinitの適切な場所にスクリプトへの呼び出しを挿入することです。スクリプトを呼び出すスクリプトを作成し、システム管理者が適切な場所にインストールするまでシステム管理者をキャジョルすることをお勧めします。

編集:さて、私はあなたの他の質問を読んだだけです、そしてあなたが誰かがデバイスを差し込んだときに非同期で起動されるスクリプトについて話しているのを見ます。あなたがしたいのは、ランレベルをチェックして、それが2(または、変更した場合はデフォルトのランレベル、シングルユーザーモードで実行する場合は1)かどうかを確認することです。 Debian FAQ正しく、ランレベルは起動が完了するまでデフォルトに変更されません。

1
peejaybee

私はinitレベルを監視します。

これで始められるはずです。

 [[ `/sbin/runlevel | cut -d " " -f 2` == 5 ]] && echo "Ready"

HTH

5
rh0dium

Debianシステムでは、/ etc/rc?.dのスクリプトの開始時の番号によって、起動中に何かが実行される順序を指定できます。そのため、そのランレベルで実行される最初のスクリプトは/etc/rc?.d/S01scriptnameになり、最後のスクリプトは/etc/rc?.d/S99scriptnameになります。スクリプトが接頭辞がS99の1つのみであることを確認することにより、スクリプトが最後に実行されるようにします。

または、最後に行うことの1つは、/ etc/rc.localを呼び出すことです。そこからスクリプトを呼び出すことで、ブートプロセスの最後にスクリプトが呼び出されるようにすることができます。

別のオプションは、ファイル/ etc/nologinのテスト-であり、これはブートの開始時に作成され、終了時に削除されます。

そうは言っても、スクリプトが機能するかどうかをテストするというあなたの考えは悪いものではないと思います。これにより、スクリプトが正しく実行されるのを妨げるものが他にないことが保証されます。

2
Brent

@rebootを時間として使用してcronジョブとして実行することもできます。

1
Keiran Holloway

システムが「準備完了」であるかどうかを確認する必要があると想定していますが、それはどういう意味ですか?このスクリプトを実行するには、どのような機能が必要ですか?ネットワークが稼働している必要がありますか? X11にはログインユーザーが必要ですか?これらの条件を直接確認するか、これらの特定の手順が完了したときに実行されるスクリプトをインストールするためのより適切な場所を見つけてください(つまり、/ etc/network/interfacesまたは類似のポストアップスタンザ)。

1
Kyle Smith

Rc3.dの下にスクリプトを追加できます。これをS99localと呼び、他のすべてのスクリプトの後に実行されます。

スクリプトはS01xxからS99xxの順に実行されます。

1
Stephan

2つの情報が答えを見つけるのに大いに役立ちます。

  1. スクリプトが起動されたときに調整できないのはなぜですか?
  2. タスクを成功させるには、どのような特定のサービス/機能を準備/機能させる必要がありますか?バツ?ネットワーキング?システム負荷が低い?ファイル共有マウント?それらのそれぞれをチェックすることができます。 「システムが起動しました」は一般的すぎて、それらのいずれかまたはすべてを含む可能性があります。
0
Walter Mundt

これが(本当に醜い)の解決策です:

  1. スクリプトでこのテストを使用します。

    while [ ! -e "/etc/yes-we-up" ]; do
        sleep 10
    done
    
  2. これを/etc/rc.localの末尾に追加します。

    touch /etc/yes-we-up && chmod 644 /etc/yes-we-up
    
  3. 作成/etc/init.d/is-we-up
    それを/etc/rc0.d/K02is-we-upおよび/etc/rc6.d/K02is-we-upにシンボリックリンクします。
    そしてこれをそれに入れてください:

    #!/bin/sh -e
    # no we ain't
    rm /etc/yes-we-up
    
0
quack quixote

ブートプロセスで呼び出される最後のファイルは、/ etc /rc.localというファイルです。そのファイルに配置するものはすべて、ブートプロセスの最後に実行されます。

このためのマニュアルの一例は http://www.netbsd.org/docs/guide/en/chap-rc.html

0
Jobst