我正在寻找一种从终端提示符“堆叠”命令的方法,以便每次只执行一个命令:
- 首先输入一个命令,按回车键,开始执行,回到shell(类似
&
) - 我可以输入第二条命令。我按下回车键,第一条命令尚未完成,因此它被堆叠(与 不同
&
)。但提示又回来了。
介于以下之间的一种混合:
&
在后台启动,但第二条命令会与第一条命令同时运行,我不想这样;&&
或者;
依次启动一个命令,但必须一次性全部写入。我想在命令执行或堆叠后重新获得提示符。
我发现最接近的答案是:
$ cmd1 &
$ wait; cmd2 &
但我正在寻找更强大的功能,允许我查看待处理、失败和已完成的命令。也许是这样的:
$ stackit cmd1
cmd1 started
$ stack it cmd2
cmd2 queued
$ stack it cmd3
cmd3 queued
$ stack it --
[1] running
[2] queued
[3] queued
或许甚至允许某种并行性,比如同时执行 2 个命令。
这看起来相当通用,所以我不想重新发明轮子。
用例:
- 在旧 NAS 之间复制文件时,如果同时运行多个操作,NAS 会受到影响
- 使用 wget 处理大量文件,但需要限制连接数
答案1
您正在寻找任务后台处理程序命令。在 Debian/Ubuntu 的存储库中,要安装的软件包是task-spooler
,要调用的二进制文件是tsp
。
在你的情况下(&&
风格),你可以使用
tsp -d cmd1
tsp -d cmd2
tsp -d cmd3
然后使用
tsp -l
检查队列的状态。
还有一些方法(-S
)可以增加最大同时作业的数量。
答案2
虽然bash
它本身没有“队列”或“堆栈”类型的作业控制,但它们确实有作业控制(它已经存在多年,可以追溯到korn
Unix System V 的 shell),你可以将进程放在后台,并使用kill
命令控制它们
DIR:/coreutils
skolodya@ubuntu:$ gedit &> /dev/null &
[1] 26742
DIR:/coreutils
skolodya@ubuntu:$ gnome-terminal &> /dev/null &
[2] 26767
DIR:/coreutils
skolodya@ubuntu:$ jobs
[2] + Running gnome-terminal >/dev/null 2>&1
[1] - Running gedit >/dev/null 2>&1
DIR:/coreutils
skolodya@ubuntu:$ kill -SIGSTOP %1
DIR:/coreutils
skolodya@ubuntu:$ jobs
[1] + Stopped (signal) gedit >/dev/null 2>&1
[2] - Running gnome-terminal >/dev/null 2>&1
DIR:/coreutils
skolodya@ubuntu:$ kill -SIGCONT %1
DIR:/coreutils
skolodya@ubuntu:$ jobs
[1] + Stopped (signal) gedit >/dev/null 2>&1
[2] - Running gnome-terminal >/dev/null 2>&1
上述示例中的这些命令的输出将转到/dev/null
,但当然,如果这是一个命令行应用程序,则您需要将输出重定向到稍后可以查看的某个位置。例如,named pipe
。
DIR:/coreutils
skolodya@ubuntu:$ mkfifo test.fifo
DIR:/coreutils
skolodya@ubuntu:$ apt-cache search 1> test.fifo &
[1] 27775
DIR:/coreutils
skolodya@ubuntu:$ cat test.fifo | head -n 3
screen - terminal multiplexer with VT100/ANSI terminal emulation
screen-dbg - Debugging symbols for GNU Screen
asic0x-dkms - iBurst USB modem driver in DKMS format
这里我将stdout
(文件描述符 1 ) 重定向到我创建的管道,稍后再查看。这可以通过创建多个命名管道,使用多个命令来完成。
边注:可以用这些选项编写一些脚本,至少在我看来,单独使用这些作业控制方法更容易。