2

私は Unix クラスの Bash を学んでおり、スクリプトを実行する方法を理解しようとしています。次に、最初のスクリプトの実行中に 2 番目のスクリプトを実行し、2 つのスクリプトを相互作用させます。明確にするために、スクリプトは次のようになります。

#!/bin/bash

num = 1
trap exit 0 SIGINT SIGTERM
trap "{ echo &num ; num++; }" SIGUSR1

while :
do
    sleep 2
done

そして2番目のもの:

#!/bin/bash

if ps | grep "$1" > /dev/null
then
    kill -SIGUSR1 $1
else
    echo "Process doesn't exist"
fi

exit 0

コードが正しくない場合の一般的な考え方は、最初のスクリプトが SIGINT または SIGTERM を受信するまでループし、SIGUSR1 を受信するたびに数値をエコーし​​てインクリメントすることです。2 番目のスクリプトは、pid を引数として取り、それが存在するかどうかをチェックし、指定されたプロセスに SIGUSR1 を送信します。問題は、最初のスクリプトを実行すると、ctrl-z でバックグラウンドに移動しない限り何もできないことですが、そこにある場合、kill シグナル以外のシグナルに応答しないようです。これを機能させる方法についてのアイデアはありますか?

4

2 に答える 2

3

mycommand &バックグラウンドでスクリプトを実行するために使用できます。Ctrl-Zスクリプトを停止しますが、 を使用bgしてバックグラウンドで実行できます。どちらの場合でも、 を使用fgして再び前面に出すことができます。

=また、 in 割り当ての前後にスペースを入れることはできず、let num++num をインクリメントするために使用できることに注意してください。trap"$num" が展開されないように、 のコマンドもシングル クォーテーションで囲む必要があります。

概して:

#!/bin/bash

num=1
trap exit 0 SIGINT SIGTERM
trap '{ echo $num ; let num++; }' SIGUSR1

while :
do
    sleep 2
done

kill -0 pid最後に、 を使用するか、単に sigusr1 を試行して結果を確認するだけで、pid が存在するかどうかをより簡単に確認して、pid "1234" の部分文字列と一致する grep "123" などを回避できます。

于 2013-01-25T22:51:40.063 に答える
1

最初のスクリプトをバックグラウンドで実行する必要があります。Ctrl+Z を押すと中断されます。次に、「bg」と入力してバックグラウンドで実行できます(標準入力から読み込もうとすると、再び停止し、「fg」コマンドで元に戻すことができます)。

もう 1 つの方法は、次のようにすでにバックグラウンドで script1 を開始することです。

$ ./script1 &

アンパサンドはバックグラウンドでジョブを開始し、すぐにプロンプ​​トに戻ります。

これがどのように機能するかについての詳細は、 「JOB CONTROL」の下にある bash の man ページ (ここにコピーがあります) を参照してください。インタラクティブ シェルからジョブを処理するための主要なコマンドは、"jobs"、"fg"、および "bg" です。

于 2013-01-25T22:51:46.387 に答える