kill进程并行启动

时间:2016-09-07 15:23:37

标签: linux bash shell

我通过启动许多进程来启动我的应用程序,我使用脚本(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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您知道从脚本开始的进程名称,那么您可以执行类似这样的操作,以使用该名称终止所有进程。

示例:杀死Skype流程

pkill skype

有关更详细的选项,请参阅man pkill

答案 2 :(得分:0)

如果您知道shell PID(进程ID),则可以执行以下操作:

pkill -TERM -P PPID

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