web-dev-qa-db-ja.com

rc.localでスクリプトを実行する:スクリプトは動作しますが、起動時は動作しません

ブート時に開始する必要がある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が機能しません。何が起こっている?

38
Jurian Sluiman

最終的に pstart になりました。

5
Jurian Sluiman

この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
70
John Doe

一部の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の元のリンクが単なるシンボリックリンクであることに気付かずに失われる可能性があります。

10
user3533658

Ubuntuでは、2つのファイルがあることに気付きました。実際のものは/etc/init.d/rc.local;他の/etc/rc.local偽物ですか?

正しいものを変更したら(/etc/init.d/rc.local)期待どおりに実行されました。

5
Boyan

また、ノードへのフルパスを指定することにより、機能させることもできます。さらに、シェルコマンドをデーモンとして実行する場合は、&の前に1 <&-を追加してstdinを閉じる必要があります。

4
w00t

私は同じ問題を抱えていました(CentOS 7で)/ etc/localに実行許可を与えることでそれを修正しました:

chmod +x /etc/rc.local
2
Gayolomao

クラウドでLinuxを使用している場合、通常は手を使って実際のハードウェアに触れる機会はありません。そのため、初めて起動するときに設定インターフェイスが表示されず、もちろん設定できません。その結果、firstbootサービスは常にrc.local。解決策は、以下を実行してfirstbootを無効にすることです。

Sudo chkconfig firstboot off

なぜrc.localは実行されません。常に/etc/rc.d/rcファイル。このファイルは常に実行され、他のサブシステム(たとえば、rc.local)を呼び出します。

2
superyuan

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を保存して再起動します。

1
lppier

/etc/rc.localを編集してから次の3つのコマンドを発行することで、スクリプトを機能させました。

Sudo mv /filename /etc/init.d/
Sudo chmod +x /etc/init.d/filename 
Sudo update-rc.d filename defaults

これで、スクリプトはブート時に機能します。

1
CatGuyTX

過去にrc.localを使用しました。しかし、私の経験から、システムのブート時にスクリプトを実行する最も信頼できる方法は、crontabで@ rebootコマンドを使用することであることを学びました。例えば:

@reboot path_to_the_start_up_script.sh
0
Heapify

スクリプトを特定のRUNレベルに配置する場合、ln -sを使用して、スクリプトを動作させたいレベルにリンクする必要があることを理解しています。

0
RVQ

rc.localでネットワーク指向のコマンドを使用していたため、時々失敗することがわかりました。これを修正するには、sleep 3をスクリプトの先頭に配置しました。理由はわかりませんが、スクリプトを実行すると、ネットワークインターフェイスが適切に構成されていないなどのように思われます。これにより、DHCPサーバーなどにしばらく時間がかかります。私は完全に理解していませんが、試してみることができると思います。

0
Jachdich

これはおそらく、PATH環境変数の欠落または不完全が原因です。

実行可能ファイル(suおよびnode)への完全な絶対パスを指定すると、機能します。

0
Asad R.

まず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が開始され、システムが再起動します。完了しました。

0
Nikhil Parashar