ターミナルエミュレータを使用してUbuntu 16.04を実行しています。
2つのスクリプトがあります:a.sh
とb.sh
。
a.sh
着信電話b.sh
。
a.sh
echo "a is running"
sleep 5s
bash b.sh
sleep 5s
echo "a is still running"
b.sh
echo "b is now running"
sleep 1000s
echo "Bananas"
a.sh
実行して完了する前にb.sh
(バナナを印刷する前に)停止し、a.sh
実行を完了して「a is still running」を印刷する方法はありますか?
pkill -f b.sh
入れてみようとしましたが、a.sh
どちらもa.sh
終わるb.sh
前に停止しましたa.sh
。
ベストアンサー1
ある瞬間に欲しいものに近づいたようです。
a.sh
#!/bin/sh
echo "a.sh running"
sleep 10s
(sleep 10s; pkill -f b.sh) &
bash b.sh
sleep 10s
pkill -f b.sh
echo "a.sh still running"
b.sh
(あなたのバージョンと同じ)
echo "b is now running"
sleep 1000s
echo "Bananas"
(sleep 10s; pkill -f b.sh) &
a.sh
の行は、10秒間休止してから終了するサブシェルを作成しますb.sh
。その後、サブシェルをバックグラウンドに配置してa.sh
実行し続けることができます。
a.sh
次に実行してb.sh
実行しますsleep 1000s
。 10秒後にsleep 10s
サブシェルが完了し、そのサブシェルが実行され、プロセスが
pkill -f b.sh
終了します。その後、ジョブを再開します。 2番目のプロセスはすでに終了しているため、何もしません。b.sh
a.sh
pkill -f b.sh
b.sh
実行すると、次のことが起こります。
$./a.sh 再実行 #即時 bは今実行中です #上記の内容から約10秒後 ./a.sh: 6行目: 13684 bash b.sh 終了 #上記の内容から約10秒後 a.shはまだ実行中です。 #上記の内容から約10秒後 $ #上の直後
a.sh
すぐに完了するとすぐに再開できるという利点があります。 10秒以上実行されているb.sh
場合にのみ開始されます。もう一つの答えでは、それが終わっても時間がかかる前にアイドル状態でなければなりません。b.sh
pkill
a.sh
sleep
pkill
b.sh
他のユーザー解放するコメント(現在は削除されました)さんが言った
わかりました。
./a.sh a.sh running b is now running Terminated
あなたが報告した内容ではありません。どんなアイデアがありますか?
暗くて風の多い夜。突然銃声が出ました!
—暗くて嵐の夜だ、スヌーピー 著者:チャールズM.シュルツ
pgrep
and の引数pkill
は正規表現です。特に拡張正規表現1です。2つをcat
同時にcut
実行してみてください。その後、実行すると両方のPIDが一覧表示されていることを確認できます。 pgrep c.t
ps
cat
cut
もしそうだったら正確に私が言ったように、あなたも私と同じ結果を得なければなりません。しかし、私はあなたが何か他のことをしたことに42人のZorkmidsを歩きたいと思います。あなたは次のいずれかを行います:
a.sh
、#!/bin/bash
代わりにshe-bang(最初の行)で始まる#!/bin/sh
a.sh
代わりに実行しbash a.sh
てください./a.sh
。
突然銃声が出ました!
b.sh
b
後ろにランダムな文字が続き、後ろに続く正規表現です。sh
自体(b.sh
)と一致しb!sh
、b~sh
、 、b&sh
などb7sh
にも一致します。bush
そして…(待ってください)…やっぱりうまくいきますbash
!
したがって、pkill -f b.sh
すべてのbashプロセス、およびb.sh
名前に含まれる他のプロセスも終了します。私が実行しているものを実行すると、私のログインシェル(少なくとも部分的にbashの影響を受けませんpkill
)はbashですがa.sh
実行中です/bin/sh
(しかしb.sh
実行中ですbash
)。このpkill -f b.sh
コマンドには以下がbash b.sh
含まれているため、プロセスを終了します。両方 bash
そしてb.sh
。しかし、/bin/sh
実行中のものはa.sh
影響を受けません。
私が信じるように実行すると仮定すると(2つのオプションのうちの1つ)、
みんなスクリプトプロセスが実行中ですbash
。だからpkill -f b.sh
命令が死んだみんなスクリプトプロセス。
pkill -f b.sh
(エスケープポイントに変更してpkill -f 'b\.sh'
一致させます。ただ文字以外の点)正しい結果を得る必要があります。
________
1 pgrep(1)
2 2つの端末(シェルウィンドウ)がある場合は、cat | cut -f1
1つの端末で実行(端末の入力を使用)し、p
別の端末で-コマンドを実行します。端末のみがある場合は実行し、sleep 42 | cat | cut -f1 &
(そうでない場合はsleep
パイプラインがすぐにクラッシュする)、p
同じウィンドウで-commandsを実行します。