2016-05-25 2 views
1

実行した後にデーモン化する必要があるbashスクリプトがあります。次のように私の解決策が見えます:bash:新しい子としてフォークプロセスでデーモン化

#!/bin/sh -xe 
child() { 
    echo child 
} 
child & # fork child 
echo parent 
kill $$ # kill parent 

しかし、機能child内全体スクリプト自身を置くことは行うには正しいことをしていないようです。残念ながらexec &は、プロセス全体をバックグラウンドの子にフォークオフしません。

希望の効果をどのように達成できますか?

答えて

2

私は通常、このような何か:ユーザーによって開始されたスクリプトを出ながら

#!/bin/bash 

if [ -z "$_IS_DAEMON" ]; then 
    _IS_DAEMON=1 /bin/bash $0 "[email protected]" & 
    exit 
fi 

echo "I'm a deamon!" 

をスクリプトが効果的に、バックグラウンドで自動的に再起動します。

デーモン化ステータスを認識するためには、それは環境変数(上記の例では$_IS_DAEMON)を使用:設定されていない場合、ユーザによって開始されたと仮定します。設定されている場合は、デーモン化の一部として開始されます。自分自身を再起動する

、スクリプトは単に$0 "[email protected]"を呼び出します:ユーザーによって開始されたよう$0は、スクリプトの名前で、"[email protected]"は(とは異なり、ホワイトスペースとすべてで保存、スクリプトに渡される引数です$*)。ほとんどの* nixシステムにある/bin/bash/bin/shの混同を避けるため、必要なシェルを明示的に呼び出すのが一般的です。

+0

@Inian、拡張答え。 – Dummy00001

+0

それはそれを説明する!素晴らしい答え! – Inian

+1

私は '/ bin/bash'を明示的に指定しますが、このトリックは他のシェルでも機能することに注意してください。唯一の問題は、 '' $ @ ''(または代替)をサポートしていないシェルが引数をそのままシェルに渡すことです。しかし、非常に古い '/ bin/sh'を持つ商用の* nixシステムの外では、問題はないはずです。 – Dummy00001

関連する問題