起動時にシェルスクリプトを実行する方法


367

Amazon S3の Linuxインスタンス、私はと呼ばれる2つのスクリプト持つstart_my_appstop_my_app起動と停止を永遠に(これは私のNode.jsアプリケーションを実行すると)。これらのスクリプトを使用して、Node.jsアプリケーションを手動で開始および停止します。ここまでは順調ですね。

私の問題:start_my_appシステムが起動するたびに実行されるように設定したいです。内部にファイルを追加する必要があるinit.dことと、それを内の適切なディレクトリにシンボリックリンクする方法はわかっていますがrc.d、実際にに配置したファイル内に何を入れる必要があるのか​​わかりませんinit.d。のように1行にするだけだと思いますがstart_my_app、それでもうまくいきません。


5
私はこの種の専門家ではありませんが、init.dソリューション(ここ)はrc.local古いツールであり、新しいツールは下位互換性があるためにまだ使用可能なため、ソリューションよりも優先されるはずです。
erikbwork 2013年

pm2 start my_app; pm2起動。保存PM2 github.com/Unitech/pm2
ユニテック

回答:


292

あなたが入れたファイルで、/etc/init.d/あなたはそれを実行可能に設定する必要があります:

chmod +x /etc/init.d/start_my_app

@meetamitのおかげで、これが実行されない場合は、へのシンボリックリンクを作成する必要があります /etc/rc.d/

ln -s /etc/init.d/start_my_app /etc/rc.d/

最新のDebianでは、スクリプトがLSBに準拠している必要があるため、これは機能しません(少なくとも、開始、停止、再起動、強制再ロード、およびステータスを提供してください): https://wiki.debian .org / LSBInitScripts

注意として、スクリプトを相対パスではなく絶対パスで配置する必要があります。これにより、予期しない問題が解決される場合があります。

/var/myscripts/start_my_app

そして、そのファイルの上に追加することを忘れないでください:

#!/bin/sh

6
私はこれを実行しましたが、実行されませんでした。/etc/init.dにあるからといって自動的に実行されますか、それともシステムの起動時に実行するようにスケジュールするために何をする必要がありますか?
両生類、2014年

4
@amphibient十分ではない...また、このファイルへのシンボリックリンクを(lnコマンドを使用して)内のディレクトリに作成する必要がありますrc.d
meetamit

23
rootのetcフォルダーにrc.dディレクトリーがありません。これは、Linuxが起動するために必要な重要なディレクトリーではないかと私は驚きました。私のOSが欠けているだけで問題なく動作しているようです。作成する必要がありますか?「rc1.d」のような似たような名前のファイルが「rc5.d」までずっと続きます
OKGimmeMoney

3
私は持っていない/etc/rc.dフォルダを、私は持っている/etc/rcX.dフォルダ(IEの/etc/rc0.d/etc/rc1.d/etc/rcS.d)、また、ファイルがあります/etc/rc.localのを。私は、シンボリックリンクをカスタムフォルダー/etc/rc9.dまたは既存のいずれかに作成する必要があると思います...(Ubuntu Server 14.04)
F8ER

2
この質問はこれで私を助け:unix.stackexchange.com/questions/28679/...
seth10

344

このためのcrontabを設定します

#crontab -e
@reboot  /home/user/test.sh

起動するたびに、テストスクリプトが実行されます。


4
これは私にとって手間のかからない唯一の解決策です!ありがとう
whoopididoo

20
これは@reboot sh $HOME/test.shcrontabがさらに
すっきりし

4
@ user3667089実際には機能していません。端末を開いて「crontab -e」と入力すると、ウィンドウが表示され、「@ reboot sh /home/user/test.sh」と書き込みますが、起動時に実行されません。どこで間違っていますか?
MycrofD 2017

1
@ user3667089通常のデフォルト行「#Edit this file to ...」、次に「@reboot sh /home/.../.sh」と書いた行。また、最初の「sh」なしで「@reboot /home/.../.sh」を試しましたが、結果がありませんでした。
MycrofD 2017

3
@MycrofD は、実際に設定されていることを確認するためにcrontab -l表示@reboot sh $HOME/test.shする必要があります。
user3667089 2017

124

単純なアプローチは、行を追加することです/etc/rc.local

/PATH/TO/MY_APP &

または、特別なユーザーとしてコマンドを実行する場合:

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(末尾のアンパサンドはプロセスの背景になり、rc.localが実行を継続できるようにします)

完全なinitスクリプトが必要な場合は、debian distroにテンプレートファイルがあるので、

cp /etc/init.d/skeleton /etc/init.d/your_app

少し調整します。


2
ありがとう!このアプローチは、単純な要件を考えると最も効果的に機能することがわかりました。私はDIDがユーザーを指定する必要があると確信しています。それ以外の場合は、手動でアプリを停止する必要がある場合(実行してstop_my_app)、そうする必要がsudoあります。また、末尾のアンパサンド(?)の機能は正確には何なのかと思います。
Meetamit 2012年

3
ユーザーはアプリに依存します。ただし、rootとして実行する必要がない場合は避けてください。&プロセスをバックグラウンドで実行します
Gilles Quenot 2012年

2
sputnick、申し訳ありませんが、主に@ erikb85が指摘したことと、元の質問で処理init.d方法を尋ねたため、Korenを承認済みの回答としてマークする必要があります(あなたの回答は、当時の私にとってはより簡単な回避策でした) 。この投稿は多くの意見や投票を獲得しているため、正確に保つことが重要です。
meetamit 2013年

4
末尾のアンパサンドがプロセスの背景になり、rc.localが実行を継続できるようになることは言及されていないようです。
mchicago

これをありがとう!私がサービスを作ろうとしている間、最後の数時間を壁に頭をぶつけて過ごしましたが、何もうまくいきませんでした。これを試して、魅力のように動作します!
MarkoGrešak15年

35

これがRed Hat Linuxでのやり方ですシステムでです。

/etc/init.drootと実行可能ファイルが所有するスクリプトをに置きます。スクリプトの上部で、次のディレクティブを指定できますchkconfig。例として、次のスクリプトを使用して、ユーザーoracleとしてJavaアプリケーションを起動します。

スクリプトの名前は /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

つまり、スクリプトはレベル3、4、5で実行する必要があり、開始/停止の優先順位は99と10です。

次に、ユーザーとしてroot使用chkconfigして、起動時にスクリプトを有効または無効にすることができます。

chkconfig --list apex
chkconfig --add apex

そして、あなたは使うことができますservice start/stop apex


その間、私は、epelリポジトリで利用可能な監視プログラム(supervisord.org)と呼ばれるパッケージを試してみました。プログラムの起動と監視に使用でき、障害発生時に再起動できます。
Saule、2014年

/etc/init.d/フォルダーにスクリプトを
書き込ん

22

cronを使用して入力sudo

sudo crontab -e

起動時に実行するコマンド、この場合はスクリプトを追加します。

@reboot sh /home/user/test.sh

セーブ:

ESCを押してから:xで保存して終了するか、ESCを押してからZZを押します(shift + zzです)。

テストテストテスト

  1. cronなしでテストスクリプトを実行して、実際に機能することを確認します。

  2. コマンドをcronに保存したことを確認してください。 sudo crontab -e

  3. サーバーを再起動して、すべてが機能することを確認します sudo @reboot


私はこれがとても好きです。ありがとう!Ps。sudo現在のユーザーを使用して起動時に特定のコマンドを実行する場合は使用しないでください。
danger89

この情報はどこに保存されますか?ない/tmp??
Peter Mortensen

15

crontabに1行追加するだけです。

ファイルが実行可能であることを確認します。

chmod +x /path_to_you_file/your_file

crontabファイルを編集するには:

crontab -e

追加する必要がある行:

@reboot  /path_to_you_file/your_file

とても簡単です!


これは私にはうまくいきません、何か足りないことがありますか?# uname -a Linux accton-xp70a0-26-a1 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

これはCentOs 7で機能しました。問題が発生した場合は、シェルスクリプトを作成し、実行可能にして(chmod + x file_name)、シェルからシェルスクリプトを呼び出して、ノードのpath_to_file / index.jsを呼び出します。
SeanOlson

11

別のオプションは、crontabに@rebootコマンドを含めることです。

cronのすべてのバージョンがこれをサポートしているわけではありませんが、インスタンスがAmazon Linux AMIに基づいている場合は機能します。


6

あなたはそれを行うことができます:

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

次に、このコマンドを使用します

update-rc.d start_my_app defaults 100

Cyber​​citiのこのページをご覧ください。


1
yoctoで構築された、かなり必要最小限の設定があり、これが私のスクリプトを機能させる唯一の方法でした。ありがとう。
Catalin Vasile 2017年

3

独自の/ init実行可能ファイルを作成する

これはあなたが望むものではありませんが、それは楽しいです!

シェルスクリプトも含め、任意の実行可能ファイルを選択し、コマンドラインパラメータを使用してカーネルを起動します。

init=/path/to/myinit

ブートの終わりに向かって、Linuxカーネルは指定されたパスで最初のユーザー空間実行可能ファイルを実行します。

いくつかのプロジェクトは人気のある init、主要なディストリビューション(systemdなど)で使用される実行可能ファイルをおり、ほとんどのディストリビューションでは、initは通常のシステム操作で使用される一連のプロセスをforkします。

しかし、それを乗っ取り/init、独自の最小限のスクリプトを実行して、システムをよりよく理解することができます。

これが最小限の再現可能なセットアップです:https : //github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init


2

このシンプルなソリューションは、CentOSを実行しているAmazon Linuxインスタンスで私に役立ちました。/etc/rc.d/rc.localファイルを編集し、そこにコマンドを配置します。このファイルには、他のすべてのinitスクリプトのに実行されることが記載されています。したがって、その点に注意してください。これは現在、ファイルが私を探す方法です。ここに画像の説明を入力してください。最後の行は私のスクリプトの名前です。


1

実行するすべてが単純なスクリプト(または何でも)である場合、絶対に最も簡単な方法は、システム>設定>次に起動アプリを使用するGUIがある場合です。

必要なスクリプトを参照するだけです。(スクリプトを実行可能にします)


3
これは実際には起動時に実行されませんが、ログイン時に実行されます。これはかなり大きな違いです。また、すべてのシステム(特にサーバーではない)に[システム]> [設定]がないため、特定の設定にも依存します。
jazzpi

検索語「linux execute at startup」がこの答えに私を導きました。OPの質問には答えませんが、これは私のようなLinux(ubuntu)初心者に役立つ可能性があるため、賛成票を投じる価値があります。私も好きではありませんが、それは実用主義です。
ティマロ


1

ルブントゥでは、私は反対の状況に対処しなければなりませんでした。起動後にSkypeが実行を開始し~/.config/autostart/、ファイルで見つかりましたskypeforlinux.desktop。ファイルの内容は次のとおりです。

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

このファイルを削除すると役に立ちました。


0
  • スクリプトを/etc/init.d/ディレクトリに追加します
  • rc実行レベルを更新します。NNは、実行 $ update-rc.d myScript.sh defaults NNする順序です。たとえば、99は98の後で100の前に実行されることを意味します。

0

Python 3マイクロサービスまたはシェルの操作。使用してのUbuntu Serverの18.04(バイオニックビーバー)またはUbuntuの19.10(Eoanアーミン)またはUbuntuの18.10(コズミック・イカ)私は常にこれらの手順と同様に行うが、それが働い常にあまりにも:

  1. 私の場合、p example "brain_microservice1.service"というマイクロサービスを作成します。

    $ nano /lib/systemd/system/brain_microservice1.service
  2. この新しいサービスの内部:

    [Unit]
    Description=brain_microservice_1
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices    /microservice_1.py -k start -DFOREGROUND
    ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
    ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
    PrivateTmp=true
    LimitNOFILE=infinity
    KillMode=mixed
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  3. 権限を付与します。

    $ chmod -X /lib/systemd/system/brain_microservice*
    $ chmod -R 775 /lib/systemd/system/brain_microservice*
  4. 次に、実行権限を付与します。

    $ systemctl daemon-reload
  5. 有効にすると、起動時に常に起動します

    $ systemctl enable brain_microservice1.service
  6. 次に、それをテストできます。

    $ sudo reboot now

  7. 終了=成功!!

これは、シェルを実行して反応する同じ本体スクリプトで実行できます...データベース起動スクリプト...あらゆる種類のosコード...これが役立つことを願っています...

...



0

これはより簡単な方法です!

まず、シェルスクリプトを記述して.shを保存します。ここに例を示します。

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

このスクリプトは、起動時に内蔵キーボードを無効にします。

第二:アプリケーション「スタートアップアプリケーションの設定」を開きます

ここに画像の説明を入力してください

ここに画像の説明を入力してください

3番目:[追加]をクリックします。4番目:NAMEセクションで名前を指定します。5番目:コマンドセクションで、.shを参照します。6番目:コマンドセクションを次のように編集します。

bash <space> path/to/file/<filename>.sh <space> --start

7番目:[追加]をクリックします。それでおしまい!完成しました!

PCを再起動して確認します。

乾杯!


-1

痛みのない、最も簡単で最も普遍的な方法は、単に~.bash_profileまたは~.profile bash_profileファイルがない場合)で実行することです

そのファイルの最後に実行コマンドを追加するだけで、システムの起動時に実行されます。

一番下にあるのはこの例です。 ~\Desktop\sound_fixer.sh


2
それは不正確です。システムが起動したときではなく~/.bash_profile、ユーザーがログインしたときに実行されます。元の質問では、意図はマシンの起動時にNode.jsアプリサーバーを実行することです。このソリューションでは、Node.jsサーバーが実行される前に、人間のユーザーが最初にマシンにログインする必要があります。問題のいくつかの種類が一晩サーバーの再起動が発生した場合や、アプリがバックで人間ログインするまで生活に戻ってくることはありません。
meetamit

-6

一部の人にとっては、これはうまくいきます:

次のコマンドをシステム設定起動アプリケーションに追加するだけです:

bash /full/path/to/your/script.sh

これはシステム環境設定メニューには表示されません。しかし、アプリケーションランチャーで検索すると表示されます。
OKGimmeMoney 2015

これは実際には起動時に実行されませんが、ログイン時に実行されます。これはかなり大きな違いです。また、すべてのシステム(特にサーバーではない)に[システム]> [設定]がないため、特定の設定にも依存します。
-jazzpi

3
この答えはUbuntu / Linuxデスクトップの方が多いようですが、ユーザーは実際にはAWS EC2 Linuxインスタンスのヘルプを要求しています。これは、私の知る限り、GUIがありません。
Vini.g.fer 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.