Bashでxtermプロセスを終了する

Bashでxtermプロセスを終了する

スクリプトでこのように開始されたxtermプロセスを終了したいと思います。

#!/bin/bash

echo "#!/bin/bash" > /tmp/test0
grep file | awk '{print "xterm -hold -e echo",$1,"sleep 10" && pid=$!}' >> /tmp/test0
echo "exit" >> /tmp/test0
chmod 700 /tmp/test0
bash /tmp/test0&
sleep 5
kill $pid  ---> does not work
exit

今、私は同じbash(test0)でこのように複数のxtermを起動するとします。そのPIDを配列に保存して終了する必要があるときにコールバックする方法はありますか?また、これらの値を保存するときにコールバックをより簡単にするために他の値(この場合は$ 1)と関連付ける方法はありますか?注: $1 = テキスト

とても感謝しています!

答え1

以下を使用してスクリプトを実行する場合:

bash /tmp/test0&

完全に別々のプロセスを開始しbash、それをバックグラウンドに配置します。このスクリプトで定義された変数は他のプロセスに属しているため表示できません。他のファイルで定義されている変数にアクセスするには、bash次のコマンドを使用してそのファイルを現在のプロセスにロードします。.またはsourceコマンド:

. /tmp/test0

その後、$pidメインスクリプトに入力して他のファイルに設定された値を取得できます。


つまり、物事を構造化する方法は非常に混乱しています。あなたが投稿したスクリプトには、質問を編集するときに実際のエラーが原因であると思われる他の多くのエラーがあります。 (これは変数$!のように使用していますが、awkコピーする変数が定義されることを期待しています。)たとえば、Bashスクリプトではtest0多くの構文エラーが発生します)。$!Bashでのみ定義& を使用してバックグラウンドプロセスを実行した後awk:コマンドが有効であっても$pid空です。この方法でプロセスのPIDを取得するには、コマンドの代わりにバックグラウンドにスクリプトを配置してxterm実行する必要がありますxterm ... &bash /tmp/test0 &test0xterm

test0完全に削除してxterm基本スクリプトから始める方が良いと思います。おそらく、より高いレベルで物事にアクセスする方法を考え直す価値があるかもしれません。。少なくとも、実際のtest0ファイルに何があるのか​​を見て、それが本当に欲しいものであることを確認してください。

答え2

(Bashスクリプトが実行されていません。エラーがあります。)

それではなぜPIDは死なないのですか? pidが間違っていますか?それとも強制的に殺すべきですかkill -9

次に、pgreppidを取得するために使用します。新しいxtermを作成し、xtermPid_1にpidを保存します。

$ xtermPid_1=$(pgrep --newest xterm)

(pgrepのマニュアルページを見てください。素晴らしいツールです。)

関連情報