我可以以某种方式将“&& prog2”添加到已经运行的 prog1 中吗?

我可以以某种方式将“&& prog2”添加到已经运行的 prog1 中吗?

&&大多数 shell 提供类似和的函数,;以某种方式链接命令的执行。但是,如果命令已经在运行,我仍然可以根据第一个命令的结果添加另一个要执行的命令吗?

说我跑了

$ /bin/myprog
some output...

但我真的很想要/bin/myprog && /usr/bin/mycleanup。我不能杀死myprog并重新启动一切,因为会浪费太多时间。如果有必要,我可以Ctrl+Z它和fg/ 。bg这是否允许我链接另一个命令?

我最感兴趣的是 bash,但欢迎所有常见 shell 的答案!

答案1

您应该能够在您所在的同一个 shell 中使用以下命令执行此操作wait

$ sleep 30 &
[1] 17440

$ wait 17440 && echo hi

...30 seconds later...
[1]+  Done                    sleep 30
hi

摘自 Bash 手册页

wait [n ...]
     Wait for each specified process and return its termination status. Each n 
     may be a process ID or a job specification; if a job spec is given,  all 
     processes  in that job's pipeline are waited for.  If n is not given, all 
     currently active child processes are waited for, and the return status is 
     zero.  If n specifies a non-existent process or job, the return status is 
     127.  Otherwise, the return status is the exit status of the last process 
     or job waited for.

答案2

fg返回并返回其恢复的程序的退出代码。因此,您可以使用 暂停程序^Z,然后使用fg && ...恢复它。

$ /bin/myprog
some output...
^Z
[1]+ Stopped              /bin/myprog
$ fg && /usr/bin/mycleanup

答案3

不确定您所要求的是否可行,但如果您仍然拥有启动程序的外壳,您可以随时检查$?最后一个进程的退出状态:

$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi

答案4

如果作业位于前台,则这些命令中的任何一个都将具有与您期望的相同的行为。

[ $? -eq 0 ] && prog2
(( $? )) || prog2

注意:$?将包含正在运行的程序退出时的返回状态。

这明确说明了如果您最初输入该命令,shell 将执行的操作。

prog1 && prog2

如果第一个命令没有读取stdin并且在前台运行,则可以在第一个命令运行时输入新命令。当第一个命令执行时,shell 将读取并执行它。如果该命令将在后台运行,则它不太可能读取stdin.

编辑:也可以将作业放在后台并使用命令WAIT。如果其他作业也在后台运行,则必须小心谨慎。需要作业规范才能让命令WAIT返回等待的作业的状态。

相关内容