web-dev-qa-db-ja.com

デーモンとしてbashスクリプトを実行する

PHPスクリプトをX回実行するスクリプトがあります。

#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done

デーモンとして起動するにはどうすればよいですか?

52
Sergey B.

シェルから完全なデーモンとして実行するには、setsidを使用してその出力をリダイレクトする必要があります。出力をログファイルにリダイレクトするか、/dev/nullにリダイレクトして破棄できます。スクリプトの名前がmyscript.shであると仮定して、次のコマンドを使用します。

setsid myscript.sh >/dev/null 2>&1 < /dev/null &

これにより、現在のシェル(stdin、stdout、およびstderr)からプロセスが完全に切り離されます。出力をログファイルに保存する場合は、最初の/dev/nullを/ path/to/logfileに置き換えます。

出力をリダイレクトする必要があります。そうしないと、真のデーモンとして実行されません(出力の読み取りと書き込みはシェルに依存します)。

117
micromoses

デーモンは、対話型ユーザーの直接制御下にあるのではなく、単にバックグラウンドプロセスとして実行されるプログラムです...

[以下のbashコードはDebianシステム用です-Ubuntu、Linux Mintディストリビューションなど]

簡単な方法:

簡単な方法は、/ etc/rc.localファイルを編集し、そこからスクリプトを実行することです(つまり、システムを起動するたびに):

Sudo nano /etc/rc.local

以下を追加して保存します。

#For a BASH script
/bin/sh TheNameOfYourScript.sh > /dev/null &

これを行うより良い方法は、Upstartでデーモンを作成することです:

Sudo nano /etc/init/TheNameOfYourDaemon.conf

以下を追加します。

description "My Daemon Job"
author "Your Name"
start on runlevel [2345]    

pre-start script
  echo "[`date`] My Daemon Starting" >> /var/log/TheNameOfYourDaemonJobLog.log
end script

exec /bin/sh TheNameOfYourScript.sh > /dev/null &

これを保存します。

正常に見えることを確認します。

init-checkconf /etc/init/TheNameOfYourDaemon.conf

マシンを再起動します:

Sudo reboot

システムを起動すると、デーモンが実行されていることを示すログファイルを確認できます。

cat  /var/log/TheNameOfYourDaemonJobLog.log

•これで、デーモンの開始/停止/再起動/ステータスを取得できます:

restart:これは停止し、サービスを開始します

Sudo service TheNameOfYourDaemonrestart restart

start:実行されていない場合、これはサービスを開始します

Sudo service TheNameOfYourDaemonstart start

stop:実行中のサービスを停止します

Sudo service TheNameOfYourDaemonstop stop

status:これはサービスのステータスを表示します

Sudo service TheNameOfYourDaemonstatus status
34
CMP

/etc/init.d/にアクセスできます-スケルトンと呼ばれるデーモンテンプレートが表示されます。

それを複製してから、start関数の下にスクリプトを入力できます。

14
Refael

別のクールなトリックは、バックグラウンドで関数またはサブシェルを実行することです。

name(){
  echo "Do something"
  sleep 1
}

# put a function in the background
name &
#Example taken from here
#https://bash.cyberciti.biz/guide/Putting_functions_in_background

バックグラウンドでサブシェルを実行する

(echo "started"; sleep 15; echo "stopped") &
1
Luis Muñoz

一部の評論家は、あなたの質問への回答はすべてのディストリビューションで機能するとは限らないと述べています。質問にはCentOSを含めず、タグにのみ含めたので、分布に関係なく彼/彼女の進行を制御するために理解する必要があるトピックをここに投稿したいと思います。

  1. initデーモンとは(オプション)
  2. inittabファイル(/ etc/inittab)とは
  3. あなたのディストリビューションでinittabファイルは何をしますか(例えば/etc/init.dのすべてのスクリプトを実際に実行しますか?

問題については、/ etc/inittabに次の行を追加してsysinitでスクリプトを開始し、終了した場合に再生成することができます。

# start and respawn after termination
ttyS0::respawn:/bin/sh /path/to/my_script.sh

スクリプトは、もちろん事前に実行可能にする必要があります。

chmod +x /path/to/my_script.sh

お役に立てれば

0
Niko