2012-05-02 15 views
0

私は、以下のコマンドを使用して、自分のサーバー上でスクリプトを1つ実行するようにしています。私は毎分これを実行するためにcronジョブを持っています。Linuxシングルインスタンスが長時間実行されない場合は終了します

How do I daemonize an arbitrary script in unix?

#!/bin/bash 

if [[ $# < 1 ]]; then 
    echo "Name of pid file not given." 
    exit 
fi 

# Get the pid file's name. 
PIDFILE=$1 
shift 

if [[ $# < 1 ]]; then 
    echo "No command given." 
    exit 
fi 

echo "Checking pid in file $PIDFILE." 

#Check to see if process running. 
PID=$(cat $PIDFILE 2>/dev/null) 
if [[ $? = 0 ]]; then 
    ps -p $PID >/dev/null 2>&1 
    if [[ $? = 0 ]]; then 
     echo "Command $1 already running." 
     exit 
    fi 
fi 

# Write our pid to file. 
echo $$ >$PIDFILE 

# Get command. 
COMMAND=$1 
shift 

# Run command 
$COMMAND "$*" 

今、私は私のスクリプトが何らかの理由でハングアップしていたので、それが立ち往生していることが分かりました。私は、$PIDFILEが "古い"かどうかをチェックし、もしそうなら、プロセスを終了させる方法を欲しいと思います。私はそれが可能であることを知っている(ファイルのタイムスタンプをチェックする)が、私は構文を知らないか、これは良い考えでもある場合。また、このスクリプトが実行されているときは、CPUをかなり使用する必要があります。ハングアップする(まれに、少なくとも1回はこれまでに発生した)場合、CPU使用率は0%に低下します。プロセスが本当に停止/非アクティブであることを確認できればうれしいですが、簡単な方法があるかどうかわかりません(そして、私はそれが殺されるところで多くの誤認を望んでいませんが、うまく走っている)。

答えて

2

あなたの問題とはかなり異なるあなたのタイトルの質問に答えるには、timeoutを使用してください。

あなたの問題では、pidファイルのFIFOキューを指定しないかぎり、どこにハングアップするかわかりません。さて、実行すると復活、あなただけの起動時に、一度このスクリプトを実行することができます

あなたが他の質問から得たコード内の別のバグが表示されます
#!/bin/bash 

while /bin/true; do 
    "[email protected]" 
    wait 
done 

"$*"をスクリプトとしてのすべての引数を渡しますa single引数。引用符がなければ、引数を空白で分割します。 "[email protected]"はそれらを個別に渡し、空白を適切に処理します。

/path/to/script command [argument]...でお電話ください。

+0

bashスクリプト(例えば、 "$ *" 'vs' "$ @" ')については十分に分かっていないので、最初にコマンドを実行したときになぜ奇妙なエラーが発生したのか理解しています。タイムアウトは私が望むように見えます。 – Matt

関連する問題