40

ブート時に起動して www-data ユーザーの下で実行する必要がある node.js スクリプトがあります。開発中、私は常にスクリプトを次のように開始しました。

su www-data -c 'node /var/www/php-jobs/manager.js

私は何が起こったのかを正確に見ました.manager.jsは今ではうまく機能します. SOを検索すると、これを自分のに配置する必要があることがわかりました/etc/rc.local。また、出力をログ ファイルにポイントし、2>&1「stderr を 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 が機能しません。何が起こっている?

4

17 に答える 17

73

この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
于 2012-12-05T11:29:40.313 に答える
12

一部の Linux (Centos & RH など) では、/etc/rc.local最初は への単なるシンボリック リンク/etc/rc.d/rc.localです。これらのシステムでは、シンボリック リンクが壊れており/etc/rc.local、別のファイルである場合、 への変更/etc/rc.localは起動時に認識されません。起動プロセスでは、バージョンが で実行され/etc/rc.dます。(/etc/rc.local手動で実行すると機能しますが、起動時には実行されません。)

ディマディマのシステムのように聞こえますが、それらは別々のファイルですが、/etc/rc.d/rc.local呼び出します/etc/rc.local

/etc/rc.localの「実際の」リンクへのシンボリック リンクは、バックアップ ディレクトリに移動して、元のディレクトリが単なるシンボリック リンクであることに気づかずに、バックアップ ディレクトリをコピーして戻すか、最初から作成すると/etc/rc.d失われる可能性があります。rc.local/etc

于 2014-04-14T21:04:15.560 に答える
5

最終的にupstartになりましたが、これは正常に動作します。

于 2011-11-30T19:05:52.727 に答える
5

Ubuntu では、2 つのファイルがあることに気付きました。本物は/etc/init.d/rc.local; /etc/rc.localもう一方は偽物だと思われますか?

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

于 2012-12-02T22:34:06.040 に答える
4

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

于 2011-10-16T14:08:52.057 に答える
2

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

sudo chkconfig firstboot off

が実行されない理由がわからない場合は、このファイルが常に実行され、他のサブシステム (rc.local など) が呼び出されるため、いつでもファイルからrc.local確認できます。/etc/rc.d/rc

于 2014-04-22T20:16:40.343 に答える
1

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

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

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

于 2013-04-25T06:07:04.053 に答える
1

CentOS7を使用しています。

$ cd  /etc/profile.d

$ vim yourstuffs.sh

yourstuffs.sh スクリプトに次のように入力します。

ここに実行したいものを入力してください

export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH

OSを保存して再起動します。

于 2015-05-29T03:09:22.007 に答える
0

これは、PATH 環境変数が欠落しているか不完全であることが原因である可能性が最も高いです。

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

于 2013-05-22T05:42:29.587 に答える
-1

1 root を使用して node app などのアプリを実行することはお勧めしません。

あなたはそれを行うことができますが、より多くの例外をキャッチする可能性があります。

2 rc.local は通常、root ユーザーとして実行されます。

したがって、スクリプトを www U などの別のユーザーとして実行する必要がある場合は、PATH とその他の環境が適切であることを確認する必要があります。

3 ユーザーとしてサービスを実行する簡単な方法を見つけました。

sudo -u www -i /the/path/of/your/script

sudo マニュアルを優先してください~ -i [コマンド] -i (初期ログインをシミュレート) オプションは、ターゲット ユーザーのパスワード データベース エントリで指定されたシェルをログインシェルとして実行します...

于 2014-07-29T08:57:07.717 に答える
-3

rc.local起動時にのみ実行されます。再起動してスクリプトを実行する場合はrc.0、K99 プレフィックスで始まるファイルに移動する必要があります。

于 2013-08-22T21:15:50.493 に答える