假设有2个任务t1
,t2
可以按如下方式串行执行:
t1 ; t2
# OR
t1 && t2
现在假设我忘记运行t2
并且t1
已经在运行;我可以将其添加t2
到管道以便它在t1
完成后执行吗?
答案1
是的你可以:
- 使用以下命令暂停当前正在运行的作业暂停字符按Ctrl+ Z。
- 键入
fg
或%
,将您想要的内容添加到列表中并执行它,例如:
由于fg ; systemctl suspend # or % ; systemctl suspend
fg
返回它所恢复的作业的返回值,列出像&&
和这样的操作符||
按预期工作:fg && echo "Finished successfully!" # or % && echo "Finished successfully!"
man bash
/作业控制关于暂停字符:
键入 暂停 进程运行时,字符(通常是
^Z
- Control)Z会导致进程停止并将控制权返回给bash
。(…)然后,用户可以使用命令在后台继续执行该作业、使用命令bg
在前台继续执行该作业fg
或使用命令终止该作业kill
来操纵该作业的状态。 字符 A^Z
立即生效,并且具有导致待处理输出和预输入被丢弃的额外副作用。
fg
解释为man bash
/SHELL 内建命令:
fg [工作规范]
恢复工作规范在前台,并使其成为当前作业。如果工作规范不存在,则使用 shell 的当前作业概念。返回值是放置在前台的命令的返回值,或者如果在禁用作业控制的情况下运行,则返回失败,或者在启用作业控制的情况下运行,如果 工作规范 没有指定有效的作业或工作规范指定在没有作业控制的情况下启动的作业。
关于作业控制的更多阅读(除此以外man bash
):
答案2
我在这里看到了这种方法:https://superuser.com/questions/334272/how-to-run-a-command-after-an-already-running-existing-one-finishes
首先执行Ctrl+z来停止(暂停)正在运行的命令,然后像这样运行错过的命令:fg && ./missed_cmd.sh
它将在fg
完成后立即运行。
(前台命令fg
)将使暂停的作业上线,并&&
确保只有在第一个命令成功时才会运行错过的命令。