如何在 bash 中计划一个任务在另一个已经运行的任务之后运行?

如何在 bash 中计划一个任务在另一个已经运行的任务之后运行?

我正在寻找类似的东西command1 ; command2,即如何command2在之后运行command1,但我想计划在已经运行command2时执行。command1

command2只需键入并按 Enter 确认即可解决此问题,假设command1不使用标准输入,并且command1不会在输出上产生太多文本,从而使键入不切实际(键入的字符与输出混合command1)。

答案1

一般来说我做的是:Ctrl+Z fg && command2

  1. Ctrl+Z暂停它并让您在 shell 中输入更多内容。
  2. (可选bg)在键入 command2 时在后台恢复 command1。
  3. fg && command2如果command1成功,则在前台恢复command1并随后将command2排队。如果您愿意,当然可以用;||来代替。&&

答案2

  1. 启动一个命令

    command1
    
  2. Ctrl按+暂停执行Z

  3. 通过执行找到暂停命令的作业号(通常已经打印到控制台 when to console when to 命令暂停)

    jobs
    
  4. 让我们command1在后台继续

    bg
    
  5. 计划执行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/whentop不再运行。

    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命令即可。

相关内容