![如何在 bash 中计划一个任务在另一个已经运行的任务之后运行?](https://linux22.com/image/144548/%E5%A6%82%E4%BD%95%E5%9C%A8%20bash%20%E4%B8%AD%E8%AE%A1%E5%88%92%E4%B8%80%E4%B8%AA%E4%BB%BB%E5%8A%A1%E5%9C%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%B7%B2%E7%BB%8F%E8%BF%90%E8%A1%8C%E7%9A%84%E4%BB%BB%E5%8A%A1%E4%B9%8B%E5%90%8E%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
我正在寻找类似的东西command1 ; command2
,即如何command2
在之后运行command1
,但我想计划在已经运行command2
时执行。command1
command2
只需键入并按 Enter 确认即可解决此问题,假设command1
不使用标准输入,并且command1
不会在输出上产生太多文本,从而使键入不切实际(键入的字符与输出混合command1
)。
答案1
一般来说我做的是:Ctrl+Z fg && command2
- Ctrl+Z暂停它并让您在 shell 中输入更多内容。
- (可选
bg
)在键入 command2 时在后台恢复 command1。 fg && command2
如果command1成功,则在前台恢复command1并随后将command2排队。如果您愿意,当然可以用;
或||
来代替。&&
答案2
启动一个命令
command1
Ctrl按+暂停执行Z
通过执行找到暂停命令的作业号(通常已经打印到控制台 when to console when to 命令暂停)
jobs
让我们
command1
在后台继续bg
计划执行
command2
等待完成command1
wait -n <command1 job number> ; command2
文档作业控制内置
答案3
有几种选择。
带有一个 & 符号,“推到后台”,第二个程序在第一个程序启动后启动,但它们可能会彼此并行运行。
command1 & command2
带两个 & 符号,“逻辑与”,只有第一个程序成功完成后,第二个程序才会启动。
command1 && command2
带分号在命令行中分隔命令,当第一个程序完成时,第二个程序将启动,即使它失败或被中断。
command1 ; command2
您可以使用
wait <PID>
等待第一个命令完成(如果它已经从同一个 shell 运行)(在同一个终端窗口中)。否则,如果第一个命令已经从另一个 shell(在另一个窗口中)运行,您可以使用一个小的while 循环使用 ps 检查 PID 是否仍然被发现
ps
。当不再找到时,将启动第二个命令。此演示示例用于
bash
检查是否top
通过 PID 运行,并运行命令echo "*** $USER, I am ready now ***"
if/when
top
不再运行。pid=$(ps -A|grep top|cut -d ' ' -f 1); \ while [ "$pid" != "" ]; do ps -A|grep "$pid" > /dev/null; \ if [ $? -eq 0 ]; then sleep 5;else pid=""; fi; done; \ echo "*** $USER, I am ready now ***"
答案4
如果您可以选择使用两个终端,您可以执行以下操作:
- 假设您已经在终端中运行command1(我们称之为terminal1)
- 启动一个新终端(我们称之为terminal2)
- 查找command1 的进程ID(我们称之为command1_pid)。在terminal2中,运行命令
ps -ef | grep <command1>
(您可能希望在grep命令中正确形成过滤字符串,这样您就不会意外地找到另一个具有子字符串的进程)。 - 运行命令
wait <command1_pid> ; command2
基本上,wait
它是一个 bash 内置命令,等待提供的 PID 退出然后返回。您只需将等待 command1 完成的任务委托给 bash 的wait
命令即可。