1

現在、bash スクリプト (Cygwin を使用) を使用していくつかのプログラムを実行しています。

基本的に私がやっていることは、プログラムが開始された後、プログラムがまだ実行されていることを確認するループが実行されることです。

やっていた:

while true
do
    if [ "$(ps -W | grep -w name | gawk '{print $8,$9}' | gawk -F \\ '{print $4}')" == 'program' ];then 
        sleep 1
    else
        "start program" (whatever is needed here)
    fi
done

しかし、そのようなスクリプトを複数回使用すると、不要なシステム リソースが使用されるだけであることに気付き始めました。

if then elif をやってみましたが、最初の if を通り越すことはありません。

「最初に負の場合は大丈夫です。次を試して、最後まで行き、最初からやり直してください」という必要があります。

これが私のスクリプトのコピーです。Cygwinを使用していたことを忘れていましたが、ファイルを開始するためのパスが異なるだけで、通常のbashスクリプトを使用しているように見えるため、実際には何も変わりません。http://pastebin.com/s8ZdPQMnはい、h. ペーストビンを編集できないようです。

私の全体的な計画は、最初の SRPro が実行されていることを確認し、次の SRPro を確認するなど、実行されていないことが検出された場合にのみトリガーすることです。

編集:解決しました。正確な理由はわかりませんが、プログラムごとの元の単一ファイルでは、最後に gawk で $4 を印刷すると、私が望んでいた結果が得られましたが、何らかの理由でこの方法で実行すると、$5 になりました。したがって、$4 を $5 に変更すると、スクリプトが機能するようになりました。

編集:しかし、1つの本当に奇妙な問題は、それが数分続けて動作し、突然混乱することがあり、1つのプログラムまたは何かの7つのコピーを開始することです。また、開始する場所をランダムにすることもできます。

4

1 に答える 1

1

waitコマンド (bash プロンプトから試すhelp wait) が役立つ場合があります。正確に何が必要かは不明ですが、例として、基本的なリスポーン関数を次に示します。

$ respawn () {
>   while true
>   do
>     "${@}" &
>     wait ${!}
>     echo "respawning ..."
>   done
> }
$ respawn some_program arg1 arg2 etc
于 2012-11-16T07:08:00.070 に答える