次のbashスクリプトがあります。
bundle exec middleman server & node script.js &&
kill -9 $(lsof -i:4567 -t) &&
bundle exec middleman build --verbose
バンドル exec 中間サーバーをシャットダウンする方法は、ポート (localhost:4567) に基づいてシャットダウンすることです。ただし、ポートを変更する必要がある場合はこれはお勧めできません。
Node script.jsを実行した後にBundle exec man-in-the-middleサーバーをシャットダウンする最良の方法は何ですか? (デフォルトでは、サーバーがオンラインになるのを待ち、get要求を送信し、返されたサーバーデータに対していくつかの操作を実行します。)ポートに依存しないタスクを実行したいと思います。名前または2番目に最近実行されたエントリ(または最後に実行されているサーバー?)で終了したいと思います。
とても感謝しています!
答え1
シェルによっては、バックグラウンド操作を簡単に終了できます。バックグラウンドで実行中の他の項目がない場合は、タスク1になるため、次のことができますkill %1
。
sauer@host:~$ set -b
sauer@host:~$ sleep 10 & echo hello
[1] 18988
hello
sauer@host:~$ kill %1
[1]+ Terminated sleep 10
バックグラウンドで他のタスクが進行中の場合に実行できるいくつかのタスクがあります。 Bashまたはシェルが同様に機能していると仮定すると、jobs -r
実行中のジョブのリストを取得し、ジョブ番号を把握するか、数値の代わりにジョブ仕様にプロセス名(パーセントの後に続く内容)を指定できます。おそらくkill %bundle
。あるいは、この場合最も便利なのは、%+
最新のバックグラウンドタスクを参照するために使用できることです。
sauer@host:~$ set -b
sauer@host:~$ sleep 10 & sleep 11 & echo hello
[1] 19406
[2] 19407
hello
sauer@host:~$ kill %+
[2]+ Terminated sleep 11
バックグラウンドで2つの休止プロセスが実行されていますが、これは%+
「最も最近の」プロセスなので終了します。set -b
次のプロンプトを待たずに、バックグラウンドジョブの状態に関する即時フィードバックを提供することもできます。これは単なる例です。 :)
ああ、そしてここに名前でバックグラウンドタスクを終了する方法とテーマがあるので、パターンが複数のプロセスと一致する場合に何が起こるかを示す有用な例があります。 「ジョブ」出力には、+
最新のジョブと2番目に最近のジョブの合計インジケーターが表示されます。これはジョブの仕様で省略されている場合があります。-
sauer@host:~$ sleep 10 & sleep 11 & sleep 9 & echo hello
[1] 22255
[2] 22256
[3] 22257
hello
sauer@host:~$ jobs
[1] Running sleep 10 &
[2]- Running sleep 11 &
[3]+ Running sleep 9 &
sauer@host:~$ kill %sleep
-bash: kill: sleep: ambiguous job spec
sauer@host:~$ kill %"sleep 10"
[1] Terminated sleep 10