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

cze*_*rny 22 bash job-control jobs

我正在寻找诸如command1 ; command2如何运行之类的东西command2command1但我想计划command2何时command1已运行的执行。

它可以通过输入command2并通过 Enter 确认来解决,假设command1不消耗标准输入,command1并且不会在输出上产生太多文本,使得输入不切实际(输入的字符与command1输出混合)。

The*_*Hat 30

通常我做的是:Ctrl+Z fg && command2

  1. Ctrl+Z暂停它并让您在 shell 中输入更多内容。
  2. 或者bg,在您输入 command2 时在后台恢复 command1。
  3. fg && command2如果 command1 成功,则在前台恢复 command1 并在之后将 command2 排队。当然你也可以替代品;||&&,如果你愿意的话。


cze*_*rny 22

  1. 启动命令

    command1
    
    Run Code Online (Sandbox Code Playgroud)
  2. Ctrl+暂停执行Z

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

    jobs
    
    Run Code Online (Sandbox Code Playgroud)
  4. 让我们command1在后台继续

    bg
    
    Run Code Online (Sandbox Code Playgroud)
  5. 计划执行command2等待完成command1

    wait -n <command1 job number> ; command2
    
    Run Code Online (Sandbox Code Playgroud)

文档作业控制内置

  • 在简单的情况下,我有时使用 control-z 然后使用 `fg ; 命令`。甚至`fg &amp;&amp; command` 只在第一个命令/管道成功时才运行第二个命令/管道。(如果没有在终端上喷出文本,您仍然可以在思考/打字时使用 `bg`。) (7认同)
  • 我对这种方法提供的超出典型`command1; 的功能有点困惑。command2` 语法。你能帮我澄清一下吗? (2认同)

sud*_*dus 8

有几种选择。

  • 使用一个&符号,“推送到后台”,第二个程序在第一个程序启动后启动,但它们可能会并排运行。

    command1 & command2
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用两个&符号,“逻辑和”,只有在第一个程序成功完成后,第二个程序才会启动。

    command1 && command2
    
    Run Code Online (Sandbox Code Playgroud)
  • 在命令行中用分号分隔命令,第二个程序将在第一个程序完成时启动,即使它失败或被中断。

    command1 ; command2
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果wait <PID>第一个命令已经在同一个 shell 中运行(在同一个终端窗口中),您可以使用它来等待第一个命令完成。

  • 否则,如果第一个命令已经从另一个 shell(在另一个窗口中)运行,您可以使用一个小的while 循环使用 ps 检查 PID 是否仍然被ps. 当它不再被找到时,将启动第二个命令。

    此演示示例用于bash检查是否top通过 PID 运行,并运行命令

    echo "*** $USER, I am ready now ***"
    
    Run Code Online (Sandbox Code Playgroud)

    如果/何时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 ***"
    
    Run Code Online (Sandbox Code Playgroud)