ブート時に開始する必要があるnode.jsスクリプトがありますおよび www-dataユーザーの下で実行します。開発中、私は常に次のスクリプトを開始しました。
su www-data -c 'node /var/www/php-jobs/manager.js
何が起こったのかを正確に見て、manager.jsがうまく動作するようになりました。検索SO /etc/rc.local
にこれを配置しなければならなかったことがわかりました。また、出力をログファイルにポイントし、2>&1
を "redirect stderr to stdout」であり、デーモンでなければならないため、最後の文字は&
です。
最後に、私の/etc/rc.local
は次のようになります。
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
su www-data -c 'node /var/www/php-jobs/manager.js >> /var/log/php-jobs.log 2>&1 &'
exit 0
これを自分で実行すると(Sudo /etc/rc.local
):はい、動作します!ただし、node
プロセスが実行されていない再起動を実行すると、/var/log/php-jobs.log
が存在しないため、manager.jsが機能しません。何が起こっている?
最終的に pstart になりました。
このrc.localスクリプトの例では、最初の実行行で自分のログファイルへのioリダイレクトを使用しています。
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
exec 2> /tmp/rc.local.log # send stderr from rc.local to a log file
exec 1>&2 # send stdout to the same log file
set -x # tell sh to display commands before execution
/opt/stuff/somefancy.error.script.sh
exit 0
一部のLinux(Centos&RHなど)では、/etc/rc.local
は最初は/etc/rc.d/rc.local
への単なるシンボリックリンクです。これらのシステムでは、シンボリックリンクが壊れており、/etc/rc.local
が別のファイルである場合、/etc/rc.local
への変更はブートアップで認識されません。ブートプロセスは/etc/rc.d
でバージョンを実行します。 (/etc/rc.local
を手動で実行すると動作しますが、起動時に実行されません。)
Dimadimaのシステムのように聞こえますが、別々のファイルですが、/etc/rc.d/rc.local
は/etc/rc.local
を呼び出します
/etc/rc.local
から「実際の」/etc/rc.d
のシンボリックリンクは、rc.local
をバックアップディレクトリに移動してコピーするか、ゼロから作成すると、/etc
の元のリンクが単なるシンボリックリンクであることに気付かずに失われる可能性があります。
Ubuntuでは、2つのファイルがあることに気付きました。実際のものは/etc/init.d/rc.local
;他の/etc/rc.local
偽物ですか?
正しいものを変更したら(/etc/init.d/rc.local
)期待どおりに実行されました。
また、ノードへのフルパスを指定することにより、機能させることもできます。さらに、シェルコマンドをデーモンとして実行する場合は、&の前に1 <&-を追加してstdinを閉じる必要があります。
私は同じ問題を抱えていました(CentOS 7で)/ etc/localに実行許可を与えることでそれを修正しました:
chmod +x /etc/rc.local
クラウドでLinuxを使用している場合、通常は手を使って実際のハードウェアに触れる機会はありません。そのため、初めて起動するときに設定インターフェイスが表示されず、もちろん設定できません。その結果、firstboot
サービスは常にrc.local
。解決策は、以下を実行してfirstboot
を無効にすることです。
Sudo chkconfig firstboot off
なぜrc.local
は実行されません。常に/etc/rc.d/rc
ファイル。このファイルは常に実行され、他のサブシステム(たとえば、rc.local)を呼び出します。
CentOS 7を使用しています。
$ cd /etc/profile.d
$ vim yourstuffs.sh
Yourstuffs.shスクリプトに次を入力します。
ここで実行するものは何でも入力してください
export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH
OSを保存して再起動します。
/etc/rc.local
を編集してから次の3つのコマンドを発行することで、スクリプトを機能させました。
Sudo mv /filename /etc/init.d/
Sudo chmod +x /etc/init.d/filename
Sudo update-rc.d filename defaults
これで、スクリプトはブート時に機能します。
過去にrc.localを使用しました。しかし、私の経験から、システムのブート時にスクリプトを実行する最も信頼できる方法は、crontabで@ rebootコマンドを使用することであることを学びました。例えば:
@reboot path_to_the_start_up_script.sh
スクリプトを特定のRUNレベルに配置する場合、ln -sを使用して、スクリプトを動作させたいレベルにリンクする必要があることを理解しています。
rc.local
でネットワーク指向のコマンドを使用していたため、時々失敗することがわかりました。これを修正するには、sleep 3
をスクリプトの先頭に配置しました。理由はわかりませんが、スクリプトを実行すると、ネットワークインターフェイスが適切に構成されていないなどのように思われます。これにより、DHCPサーバーなどにしばらく時間がかかります。私は完全に理解していませんが、試してみることができると思います。
これはおそらく、PATH環境変数の欠落または不完全が原因です。
実行可能ファイル(suおよびnode)への完全な絶対パスを指定すると、機能します。
まずSudo chmod 755 /path/of/the/file.sh
を使用してスクリプトを実行可能にします。rc.localのexit 0の前にrc.localにスクリプトを追加しますsh /path/of/the/file.sh
次に、次にSudo chmod 755 /etc/rc.local
rc.local use Sudo /etc/init.d/rc.local start
を初期化すると、rc.localが開始され、システムが再起動します。完了しました。