web-dev-qa-db-ja.com

起動後にrc.localのbashコードが実行されない

システムが起動時にrc.local内のスクリプトコードを実行しない理由を誰かが知っていますか? VMware ESX(Red Hat)の初期インストール後に実行したい構成後のbashスクリプトがありますが、何らかの理由で実行されないようです。ある時点で失敗した場合にどこまで到達するかを確認できるように、実行の開始と進行状況をログに記録するように設定していますが、そのログを見ても、開始されていないことがわかります。スクリプトコードの実行。スクリプトに実行権限(755)があることを確認しましたが、他に何を確認する必要がありますか?

これが私のコードの最初の数行です:

#!/bin/sh
echo >> /tmp/configLog ""
echo >> /tmp/configLog "Entering maintenance mode"
2
mrTomahawk

それで、/ tmp/configLogは存在しますか?もしそうなら、あなたのスクリプトは発火していて、どこかで死にかけているだけです。

基本から始めましょう:

  1. このように、/ etc /rc.localに単純なワンライナーを配置します。
    / tmp/itworkedをタッチします
    それは機能しましたか?再起動後、/ tmp/itworkedは存在しますか?その場合、rc.localが実行されています。
  2. もう1つの一般的な落とし穴は、スクリプトがデーモンの場合、バックグラウンドへのフォークを処理するか、rc.localでバックグラウンドにする必要があることです。スクリプトが/ bin/myscriptの場合、rc.localには次のものが必要です。
    / bin/myscript&
    初期化。実行に時間がかかりますか?ユーザーがブートプロセスを停止できないようにするために、initスクリプトのどこかにタイムアウトがある可能性があります。プロセスをバックグラウンドで実行すると、プロセスが存在する場合はそれを回避できます。
  3. 「タッチ」が機能し、バックグラウンドを使用している場合は、スクリプトのどこかにある必要があります。実行するとどうなりますか
    / bin/sh /etc/rc.local
    コマンドラインから?
  4. Jasonが言ったように、手がかりがないかdmesgと/ var/log/messagesを確認してください。
  5. スクリプトがrc.localから実行される場合、ログイン時にrootユーザーが持っている環境変数の完全なセットは含まれません。 $ PATHは異なる場合があります。 $ PATHに依存しないでください。また、環境のシミュレーションに近い「at」ジョブをスケジュールして、スクリプトをテストすることもできます。
3
Justin Ellison

システムがrc.localをサポートしていることを確認しますか?文書化されていない場合は、すべてのinitスクリプトに従う必要があります。/etc/inittabから開始します。 (そこから/etc/rc.d/rcに移動することがあります)

一部のシステムでは、/ etc/rc.d /rc.localはシンボリックリンク/etc/rc.d/rcX.d/S99localを介してサポートされます。 (ここで、Xは適切なランレベルです)。

RedHatを使用している場合、独自のinitスクリプトを作成せず、それを/etc/rc.d/init.dに追加し、chkconfig ---スクリプトを追加し、スクリプトにchkconfigを追加する本当の理由はありません。これにより、/ etc/rc.d/rcX.dディレクトリへの正しいシンボリックリンクが作成され、initスクリプトの展開または無効化が容易になります。

廃止されたrc.localを使用することは、システムがそれをサポートしている場合、迅速なハッキングには問題ありませんが、重要または永続的なものにはあまり適していません。

1
carlito

Linuxでのinitスクリプトの処理が順次か並列かはわかりませんが、Solarisシステムはスクリプトを順次起動します。以前のinitスクリプトがまだ終了していない場合(sendmail/DNSの依存関係が原因でこれが表示されることがあります)、後のスクリプトは想定したほど速く起動されません。

Psを使用して、以前のinitスクリプトがまだ実行されているかどうかを確認します。

1
Chaim Geretz

タイプミスのような単純なものではありませんか?これが必要です:

#!/bin/hash

本当にあります:

#!/bin/bash

(CKがコメントで言ったように、今私は見ています)

1
x3ja

rc.localは、スタートアップスクリプトを実行するBSDの方法でした。多くのLinuxバージョンは、起動時に実行される「rc.local」というファイルのサポートをサポートしていますが、LinuxはSolarisの起動スクリプトの処理方法に従っているため、これらを機能させるには多数のシンボリックリンクやその他の接着剤が必要でした。

0
pcapademic

その最初の行に実際に#!/ bin/hashと表示されている場合は、次のようなエラーが発生します。

-bash: ./test.sh: /bin/hash: bad interpreter: No such file or directory

それが実行されるとき。

スクリプトに実行権限があることを確認することもできます。

0
Tom Bascom

おそらく、rc.localスクリプトに構文エラーがあります。システムの起動後にコマンドラインから手動で実行しようとすると、正しく実行されますか?

0
Dave K

Rc.localファイルを含むディレクトリのアクセス許可を確認しましたか?

0
Nik Reiman

あなたのコードはもっとこのように見えるべきではありませんか?ここで3つの変更:

#!/bin/bash
echo "" >> /tmp/configLog
echo "Entering maintenance mode" >> /tmp/configLog
0
Ian Kelling

SELinux。

Getenforceを試して、selinuxがオンになっているかどうかを確認してください。オンにすると、1または強制を返します。次に、dmesgをチェックして、スクリプトに関係しているように見えるselinux関連のエラーがあるかどうかを確認します。

0
Jason Tan