0

サーバー上でスクリプトの単一インスタンスを実行し続けるために、次を使用しています。これを毎分実行するcronjobがあります。

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% に低下します。プロセスが本当にハングアップしているか、アクティブでないかを確認できればいいのですが、それを行う簡単な方法があるかどうかはわかりません (そして、プロセスが強制終了される場所で多くの誤検知を発生させたくありませんが、元気に走っています)。

4

1 に答える 1

2

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

さて、あなたの問題については、pidファイルのfifoキューを指定しない限り、どこでハングするかわかりません。ここで、実行して再生成するには、起動時にこのスクリプトを 1 回実行するだけです。

#!/bin/bash

while /bin/true; do
    "$@"
    wait
done

これにより、他の質問から得たコードに別のバグが発生します。すべての引数が単一の引数"$*"としてスクリプトに渡されます。引用符がないと、引数が空白で分割されます。それらを個別に渡し、空白を適切に処理します。"$@"

で呼び出し/path/to/script command [argument]...ます。

于 2012-05-02T16:10:34.657 に答える