私はUbuntu 14.04サーバーを持っています。これは、起動時に、通常のユーザーが(sshを介して)ログインする前に、ネットワーク経由でいくつかのものを同期する必要があります。
/etc/rc.local
からスクリプトを呼び出すのが適切かどうか疑問に思いましたか?
このスクリプトのコメントを見てください:
このスクリプトは、各マルチユーザーランレベルの最後に実行されます。
システムがユーザーからのログインを受け入れる準備ができた後に呼び出されたようです。
これが、「各マルチユーザーランレベルの最後」を理解する方法です。
私はここで答えを見ました: /etc/rc.local
の目的と典型的な使用法 、私はまだそれが少し曖昧であることに気づきました。
もう少しコンテキストが適切です。これは自動化されたプロセスであり、ユーザーは実際には多くのマシンがサーバーをポーリングしてログインします。
通常、_/etc/rc.local
_が有効なオプションですが、「何かの同期」に関連する作業量や、このアクションが完了する前にユーザーがログインできないことがどれほど重要かにも依存します。
ユーザーがログインする前に同期が完了したことを確認したい場合は、2つの「nologin」オプションのいずれかを検討できます。
同期前に(特定のユーザーグループの)ログインシェルを_/usr/sbin/nologin
_に設定し、同期後に復元するスクリプトを記述します。
_/etc/nologin
_を使用して同期する前に空の_touch /etc/nologin
_ファイルを作成し、同期後に削除します。このオプションは、root以外のすべてのアカウントがログインできないため、SSH経由でrootとしてのログインを無効にした場合、簡単にロックアウトされる可能性があることに注意してください。
説明するケースでは、/etc/rc.local
から同期スクリプトを呼び出すことは有効なソリューションです。他の人が思いつく他の解決策は間違いなくありますが、それはおそらく私も一緒に行くだろうものです。
これは、すべての「組み込み」rc起動スクリプトの後、ただしログインプロンプトがコンソールに表示される前に実行されます。ただし、rc.local
が実行される前に、ユーザーはSSH経由でシステムにログインできることに注意してください。これが懸念される場合は、ネットワークが開始された後、SSHが開始される前に、スクリプトを起動シーケンスに入れることができます。私がまだrc.local
を使用し、その場所を移動することを心配しない理由は、SSHデーモンが起動してからユーザーがシステムが利用可能であることに気付くまでの時間が、システムが到達して実行するのにかかる時間よりもはるかに長い可能性があるためです。 rc.local
スクリプト。
システムがユーザーからのログインを受け入れる準備ができた後に呼び出されたようです。これが、「各マルチユーザーランレベルの最後」を理解する方法です。
いいえ、/etc/rc.local
はシステムの起動時に実行されます。 (sshを使用してユーザーがログインすると、環境が設定され、/etc/profile
~/.bashrc
からスクリプトが実行されます。詳細は このページ を参照してください。)
/etc/rc.localからスクリプトを呼び出すのが正しい場所かどうか疑問に思っていましたか?
はい、できます
私は個人的に@Johnのソリューションを使用しますが、起動シーケンスを設定して、最初(S01シンボリックリンクの近く)で次のコマンドを実行することもできます。
echo "Please try to log in later" > /etc/nologin
そして、/etc/rc.local
を入力します:
/root/yourscript.sh
rm -f /etc/nologin
/etc/nologin
ファイルが存在するため、root以外のユーザーはSSHまたはコンソールからログインできません。これにより、スクリプトが完了する前にユーザーがログインしないことが保証されます。