在 shell 中将多个作业排队到当前作业之后

在 shell 中将多个作业排队到当前作业之后

以前的 问题与我的类似,建议的解决方案都是用Ctrl+暂停当前的前台任务Z,然后运行fg && ...​​or fg ; ...(可能首先将旧任务发送到后台bg,以便在键入新命令时它可以继续运行)。

至少对我来说,这只适用于单个排队命令。当我尝试连续多次使用这个技巧时,中间的命令被忘记了:

$ sleep 60 && echo test1

^Z
[1]  + 2336348 suspended  sleep 60

$ fg && echo test2
[1]  + 2336348 continued  sleep 60

^Z
[1]  + 2336348 suspended  sleep 60

$ fg && echo test3
[1]  + 2336348 continued  sleep 60

test3

请注意 howtest1从未被打印过(尽管我可以接受这一点,但这只是因为我的初始命令由两个组成,并且我的命令sleep 60已完全执行,这是我最关心的)。更重要的是,请注意如何test2从未打印出来。这是我的第二个命令,我相信它从未被执行过。

我想要的是将我刚刚想到的另一个命令排队(当其他命令正在运行时),以便它在当前命令之后以及我之前排队的所有其他命令之后/之前运行。命令的顺序最终并不重要,但它们不能同时运行(否则我可以打开另一个 shell 并在那里运行它们),因为它们依赖于某些常见状态(文件系统等)。

感谢您的帮助!

答案1

如果您使用的是 GNU/Linux 系统或安装了 coreutils,请使用羊群(1)(也许使用可执行文件/命令本身作为锁定文件):

% cat linger
echo -n $$; date +%s; sleep $1

% flock ./linger ./linger 8 &
[3] 5941
% 59421598557788

% flock ./linger ./linger 9 &
[4] 5945
% flock ./linger ./linger 11 &
[5] 5946
% 59471598557796
59501598557805

[3]   Done                    flock ./linger ./linger 8
[4]   Done                    flock ./linger ./linger 9
[5]   Done                    flock ./linger ./linger 11

您尝试做的事情不起作用,因为对于 shell 来说,停止命令就像它立即以非零(失败)状态退出:

% sleep 10 || echo FAIL
^Z
[3]+  Stopped                 sleep 10
FAIL
% fg
sleep 10
% echo $?
0

相关内容