Answers:
如果您输入
command 1 & command 2
这等于
command 1 &
command 2
即这将在后台运行第一个命令,然后在前台运行第二个命令。尤其是,这意味着即使您仍在运行,也要echo "done"
在command 2
完成打印后进行打印command 1
。
你可能想要
command 1 &
command 2 &
wait
echo "done"
这将在后台运行两个命令,并等待两个命令完成。
如果按CTRL-C,则只会将SIGINT信号发送到前台进程,即command 2
您的版本或wait
我的版本。
我建议设置这样的陷阱:
#!/bin/bash
trap killgroup SIGINT
killgroup(){
echo killing...
kill 0
}
loop(){
echo $1
sleep $1
loop $1
}
loop 1 &
loop 2 &
wait
使用陷阱可以捕获CTRL-C产生的SIGINT信号,并替换为该killgroup
函数,该函数将杀死所有这些进程。
set -x
在脚本开头使用来打印执行的命令。
从脚本将命令置于后台时,PID不会显示在屏幕上。您可以使用$!
存储最后一个进程的PID 的内置变量,以便捕获command1的PID。
command1 &
echo $!
将回显command1的PID。
Bash还提供了内置的陷阱,您可以使用该陷阱注册接收特定信号时要运行的命令序列。您可以使用它在退出主脚本之前捕获SIGINT并杀死command1,例如
#!/bin/bash
onINT() {
echo "Killing command1 $command1PID too"
kill -INT "$command1PID"
exit
}
trap "onINT" SIGINT
command1 &
command1PID="$!"
comamnd2
echo Done
现在,在运行命令2的同时,点击Ctrl C将导致同时向command1和command2发送SIGINT。
%n
语法杀死该Shell中的特定后台作业。通常,您发出kill %1
命令杀死最新的且唯一的后台进程。如果有更多后台进程,jobs
请先查看列表。
较新版本的GNU Parallel将满足您的要求:
parallel ::: "command 1" "command 2"
echo "done"
或者,如果command
保持不变:
parallel command ::: 1 2
echo done
观看介绍视频以获取快速介绍:https : //www.youtube.com/playlist?list=PL284C9FF2488BC6D1
浏览本教程(man parallel_tutorial)。您会用它来爱您。
Ctrl+ C将SIGINT信号发送到您的前端进程,即command2
。command1
在后台运行,因此不受输入流的影响。
当您键入时command1 &
,bash应该为您提供进程的PID,例如[1234]
。要终止此过程,可以使用kill 1234
。现在,如果你同时拥有的PID command1
和command2
(看看ps -ef
),你可以使用kill
终止所有这些:
kill pid1 pid2 pid3 ...
一个小技巧是在后台运行两个命令:
command1 & command2 &
Bash会给你两个PID,准备被杀死。另一个诀窍是command1
一旦您杀死了,就让自己回到前台command2
:
command1 & command2
# Hit Ctrl+C : command2 terminates.
fg # Bring back command1 to foreground.
# Hit Ctrl+C again, command1 terminates.
可在此处获取更多信息:http : //linuxg.net/how-to-manage-background-and-foreground-processes/