PHPスクリプトをX回実行するスクリプトがあります。
#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
デーモンとして起動するにはどうすればよいですか?
シェルから完全なデーモンとして実行するには、setsid
を使用してその出力をリダイレクトする必要があります。出力をログファイルにリダイレクトするか、/dev/null
にリダイレクトして破棄できます。スクリプトの名前がmyscript.shであると仮定して、次のコマンドを使用します。
setsid myscript.sh >/dev/null 2>&1 < /dev/null &
これにより、現在のシェル(stdin、stdout、およびstderr)からプロセスが完全に切り離されます。出力をログファイルに保存する場合は、最初の/dev/null
を/ path/to/logfileに置き換えます。
出力をリダイレクトする必要があります。そうしないと、真のデーモンとして実行されません(出力の読み取りと書き込みはシェルに依存します)。
デーモンは、対話型ユーザーの直接制御下にあるのではなく、単にバックグラウンドプロセスとして実行されるプログラムです...
[以下の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
/etc/init.d/にアクセスできます-スケルトンと呼ばれるデーモンテンプレートが表示されます。
それを複製してから、start関数の下にスクリプトを入力できます。
別のクールなトリックは、バックグラウンドで関数またはサブシェルを実行することです。
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") &
一部の評論家は、あなたの質問への回答はすべてのディストリビューションで機能するとは限らないと述べています。質問にはCentOSを含めず、タグにのみ含めたので、分布に関係なく彼/彼女の進行を制御するために理解する必要があるトピックをここに投稿したいと思います。
問題については、/ etc/inittabに次の行を追加してsysinitでスクリプトを開始し、終了した場合に再生成することができます。
# start and respawn after termination
ttyS0::respawn:/bin/sh /path/to/my_script.sh
スクリプトは、もちろん事前に実行可能にする必要があります。
chmod +x /path/to/my_script.sh
お役に立てれば