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