序列化 shell 命令

序列化 shell 命令

我正在寻找一种从终端提示符“堆叠”命令的方法,以便每次只执行一个命令:

  • 首先输入一个命令,按回车键,开始执行,回到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它本身没有“队列”或“堆栈”类型的作业控制,但它们确实有作业控制(它已经存在多年,可以追溯到kornUnix 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 ) 重定向到我创建的管道,稍后再查看。这可以通过创建多个命名管道,使用多个命令来完成。

边注:可以用这些选项编写一些脚本,至少在我看来,单独使用这些作业控制方法更容易。

相关内容