我设置了一些东西,以便打开 3 个 shell 并一一运行程序:
cd foo/bar
./foo.sh
cd foo/bar
node bar.js
cd foo/bar
ruby foobar.rb
不过,由于这很耗时,所以我写了一个shell脚本来做到这一点:
cd foo/bar
./foo.sh &
node bar.js &
ruby foobar.rb
但是,当我按 CTRL-C 停止该脚本时,其他 2 个程序仍在运行。如果我输入
jobs
它不会显示后台进程(可能属于脚本)——如果显示了,我可以fg
将它们带到前台并在它们上一一按 CTRL-C,所以我必须这样做
ps ax | grep foo
ps ax | grep bar
查找进程 ID,然后终止进程。
有没有更好的方法可以自动打开 3 个 shell 并运行 3 个程序,使它们像我打开 3 个 shell 并运行它们一样?我不关心 STDOUT 输出,所以如果一个 shell 窗口被分成 3 个部分,那就没问题了。
tmux、emacs 或任何其他工具可以实现这个目标吗? (我对 tmux 或 emacs 不太熟悉,不知道这是否可能)。
答案1
不是您主要问题的答案(我screen
自己就是用户,从来没有觉得需要移动到tmux
),而是对以下内容的评论:
不过,由于比较耗时,所以我写了一个shell脚本来做:
cd foo/bar ./foo.sh & node bar.js & ruby foobar.rb
但是,当我按 CTRL-C 停止该脚本时,其他 2 个程序仍在运行
当您在非交互式 shell 中执行此操作时,shell 将按照 POSIX 要求cmd &
运行的进程将 SIGINT 和 SIGQUIT 信号的处理设置为“忽略”,这解释了为什么+不会杀死它们。cmd
Ctrlc
但是,包括 zsh、bash、mksh 和 yash(但忽略该命令的 dash、ksh93、bosh 除外trap
)在内的多个 shell 允许您使用以下命令恢复这些信号的默认配置:
#! /bin/zsh -
cd foo/bar || exit
(trap - INT QUIT; ./foo.sh) &
(trap - INT QUIT; node bar.js) &
ruby foobar.rb
wait
然后,Ctrl+c也会杀死那些异步启动的命令。