2016-09-07 144 views
0

我通过启动很多进程来启动我的应用程序,我使用脚本(bash)启动它。杀死进程并行启动

  • 的filemane是:start.sh我用sudo ./start.sh运行
  • 脚本在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

如果你知道你的shell的PID(进程ID),你可以这样做:

pkill -TERM -P PPID 

其中PPID是你的shell的PID(子进程的父进程的PID)。

+0

'bash'中的'$$'通常不是shell'pid'吗? –