web-dev-qa-db-ja.com

/etc/rc.localは、(通常の)ユーザーがログインする前にスクリプトを実行するのに適した場所ですか?

私はUbuntu 14.04サーバーを持っています。これは、起動時に、通常のユーザーが(sshを介して)ログインする前に、ネットワーク経由でいくつかのものを同期する必要があります。

/etc/rc.localからスクリプトを呼び出すのが適切かどうか疑問に思いましたか?

このスクリプトのコメントを見てください:

このスクリプトは、各マルチユーザーランレベルの最後に実行されます。

システムがユーザーからのログインを受け入れる準備ができた後に呼び出されたようです。

これが、「各マルチユーザーランレベルの最後」を理解する方法です。

私はここで答えを見ました: /etc/rc.localの目的と典型的な使用法 、私はまだそれが少し曖昧であることに気づきました。

更新

もう少しコンテキストが適切です。これは自動化されたプロセスであり、ユーザーは実際には多くのマシンがサーバーをポーリングしてログインします。

5
cecemel

通常、_/etc/rc.local_が有効なオプションですが、「何かの同期」に関連する作業量や、このアクションが完了する前にユーザーがログインできないことがどれほど重要かにも依存します。

ユーザーがログインする前に同期が完了したことを確認したい場合は、2つの「nologin」オプションのいずれかを検討できます。

  1. 同期前に(特定のユーザーグループの)ログインシェルを_/usr/sbin/nologin_に設定し、同期後に復元するスクリプトを記述します。

  2. _/etc/nologin_を使用して同期する前に空の_touch /etc/nologin_ファイルを作成し、同期後に削除します。このオプションは、root以外のすべてのアカウントがログインできないため、SSH経由でrootとしてのログインを無効にした場合、簡単にロックアウトされる可能性があることに注意してください。

4
Benjamin B.

説明するケースでは、/etc/rc.localから同期スクリプトを呼び出すことは有効なソリューションです。他の人が思いつく他の解決策は間違いなくありますが、それはおそらく私も一緒に行くだろうものです。

これは、すべての「組み込み」rc起動スクリプトの後、ただしログインプロンプトがコンソールに表示される前に実行されます。ただし、rc.localが実行される前に、ユーザーはSSH経由でシステムにログインできることに注意してください。これが懸念される場合は、ネットワークが開始された後、SSHが開始される前に、スクリプトを起動シーケンスに入れることができます。私がまだrc.localを使用し、その場所を移動することを心配しない理由は、SSHデーモンが起動してからユーザーがシステムが利用可能であることに気付くまでの時間が、システムが到達して実行するのにかかる時間よりもはるかに長い可能性があるためです。 rc.localスクリプト。

3
John

システムがユーザーからのログインを受け入れる準備ができた後に呼び出されたようです。これが、「各マルチユーザーランレベルの最後」を理解する方法です。

いいえ、/etc/rc.localはシステムの起動時に実行されます。 (sshを使用してユーザーがログインすると、環境が設定され、/etc/profile~/.bashrcからスクリプトが実行されます。詳細は このページ を参照してください。)

/etc/rc.localからスクリプトを呼び出すのが正しい場所かどうか疑問に思っていましたか?

はい、できます

2
Rahul Patil

私は個人的に@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またはコンソールからログインできません。これにより、スクリプトが完了する前にユーザーがログインしないことが保証されます。

1
dr_