2013-10-07 4 views
41

ように私は私のPHPスクリプトを実行するスクリプト、各Xの時間を持っている:実行bashスクリプトデーモン

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

は、どのように私はデーモンとして、それを起動することができますか?

答えて

91

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

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

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

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

+5

どうすればそれを殺すのですか? –

+7

あなたはそれがpidであることを発見し、それに信号を送る必要があります。 LinuxシステムのUNSAFEの例を以下に示します: 'kill $(ps -fade | grep myscript.sh | grep -v grep | awk '{print $ 2}')'。これにより、名前やパラメータに "myscript.sh"を含むすべてのプロセスが強制終了されるため、使用するのはあまり安全ではありませんが、必要に応じて調整することができます。 – micromoses

+3

ありがとう、これは役に立ちます! '2>&1

15

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

それを複製して、開始機能の下にスクリプトを入力することができます。

+2

また、バックグラウンドでスクリプトを実行することを検討することもできます最後に '&'を追加するか、nohupで実行してください。 –

+0

@LuisMuñozどうすれば自動的にバックグラウンドで実行させることができます。たとえば、/etc/init.d/mysql startを実行すると、デーモンはデフォルトでバックグラウンドで起動して実行されます。 –

+0

@DavidOkwiiは、コードを関数に置き、バックグラウンドで実行します。この質問に追加された私の答えをチェックしてください。 –

23

Aデーモン

[以下のbashコードはDebianシステムのためのものである...むしろインタラクティブユーザの直接制御下にあるよりも、バックグラウンドプロセスとして実行だけプログラムである - のUbuntu、Linuxのミントディストリビューションとそう簡単な方法

]上:

簡単な方法は、あなたの/etc/rc.localのファイルを編集して、そこからスクリプトの実行を持っているだろう(つまり、毎回あなたは、システムを起動) :

sudo nano /etc/rc.local 

次の行を追加し、保存します。

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

これを行うには良い方法は成り上がり経由でデーモンを作成するには、次のようになります。

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 & 

これを保存します。

は、それがOKに見えることを確認します。

init-checkconf /etc/init/TheNameOfYourDaemon.conf 

は今、マシンを再起動:

sudo reboot 

今、あなたのシステムを起動するとき、あなたはあなたのデーモンが動作していることを示すログファイルを見ることができます:

cat /var/log/TheNameOfYourDaemonJobLog.log 

•ここから、あなたのデーモンの状態を開始/停止/再起動/取得できます。 :

再起動:これは

sudo service TheNameOfYourDaemonrestart restart 

開始サービスを開始し、その後、停止します。この意志:それは

sudo service TheNameOfYourDaemonstart start 

停止を実行していない場合、これは、サービスを開始しますサービスが停止している場合は、サービスを停止してください。

sudo service TheNameOfYourDaemonstop stop 

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

sudo service TheNameOfYourDaemonstatus status 
+4

でそれを強制終了してください。すべてのディストリビューションで正しい。 – SgtPooki

+1

良い点sgtPooki。私の例がUbuntu/Mintディストリビューションなどを指していることを説明する警告を追加しました。コメントいただきありがとうございます。 – CMP

+0

誰かがこの回答にシステムアドオンを行うことができますか? :) – Mitja

1

別のクールなトリックは

でサブシェルを実行
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") & 
関連する問題