2016-09-07 11 views
0

私は多くのプロセスを起動してアプリケーションを起動します。私は起動するためにスクリプト(bash)を使います。プロセスを並行して開始するkill

  • filemaneがある:start.shと私はstart.sh
  • スクリプトを実行するためにsudo ./start.shを使用している:

#!/bin/sh sudo p1 > p1.txt && p2 > p2.txt && p3 > p3.txt

私はctrl-cを使用ではなく、すべてのプロセスが停止する私のアプリを停止します。私はps aux | less | grep ...と見つけることができることを知っています、これは長く見えますが、私のプロセスを止めるのが簡単であるかどうかを知りたいのです。それはあなたがあなたのスクリプトで起動するプロセス名を知っている場合、あなたはすべて殺すこのような何かを行うことができ、この代わりに、(一つだけ&

sudo f1/p1.py > logs/p1.txt & sudo f2/p2.sh > logs/p2.txt & sudo nodemon f3/p3.js > logs/p3.txt 
+2

'PS && P2 && P3 ...'、そしてあなたは、唯一のプロセスがで実行しています時間。 p1が正常に完了すると、p2が開始されます。 – anishsane

+0

また、 'start.sh'は' sudo'で始まったので、 'sudo'で' p1'を明示的に起動する必要はありません。 – anishsane

+0

これらの個々のプロセスが 'ctrl + c'(またはより正確には' SIGINT')にどのように反応するかは、そのアプリケーションがどのようにコード化されているかに依存します。 'SIGINT'を処理して、それがどのようにコード化されているかに基づいて、成功または失敗で終了することができます。 'ctrl + c'(SIGINTを渡す)を押してもプロセスが終了するわけではありません。それは通常の/共通の行動ですが、そのように行動することは必須ではありません。 – anishsane

答えて

1

ストアのPID、およびシグナルまたは終了時にときにそれらを殺すためにトラップを設定する:あなたが持っている場合は

#!/bin/bash 
#  ^^^^ - NOT /bin/sh, as this code uses arrays 

pids=() 

# define cleanup function 
cleanup() { 
    for pid in "${pids[@]}"; do 
    kill -0 "$pid" && kill "$pid" # kill process only if it's still running 
    done 
} 

# and set that function to run before we exit, or specifically when we get a SIGTERM 
trap cleanup EXIT TERM 

sudo f1/p1.py > logs/p1.txt & pids+=("$!") 
sudo f2/p2.sh > logs/p2.txt & pids+=("$!") 
sudo nodemon f3/p3.js > logs/p3.txt & pids+=("$!") 

wait # sleep until all background processes have exited, or a trap fires 
0

ある 申し訳ありません

更新その名前のプロセス。

例:より詳細なオプションについては、Skypeのプロセスを強制終了し

pkill skype 

man pkillを参照してください。

0

あなたのシェルPID(プロセスID)を知っている場合は、あなたが行うことができます:

PPIDはあなたのシェルのPID(サブプロセスの親のPID)である
pkill -TERM -P PPID 

+0

'bash'の' $$ 'のシェルは' pid'ではありませんか? –