如何自动打开 3 个 shell 并运行 3 个命令?

如何自动打开 3 个 shell 并运行 3 个命令?

我设置了一些东西,以便打开 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 信号的处理设置为“忽略”,这解释了为什么+不会杀死它们。cmdCtrlc

但是,包括 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也会杀死那些异步启动的命令。

相关内容