スクリプトでこのように開始された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 &
test0
xterm
test0
完全に削除してxterm
基本スクリプトから始める方が良いと思います。おそらく、より高いレベルで物事にアクセスする方法を考え直す価値があるかもしれません。。少なくとも、実際のtest0
ファイルに何があるのかを見て、それが本当に欲しいものであることを確認してください。
答え2
(Bashスクリプトが実行されていません。エラーがあります。)
それではなぜPIDは死なないのですか? pidが間違っていますか?それとも強制的に殺すべきですかkill -9
?
次に、pgrep
pidを取得するために使用します。新しいxtermを作成し、xtermPid_1にpidを保存します。
$ xtermPid_1=$(pgrep --newest xterm)
(pgrepのマニュアルページを見てください。素晴らしいツールです。)