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


87

大多数shell提供某些功能,&&;以某种方式链接命令的执行。但是,如果命令已经在运行,我还能根据第一个命令的结果以某种方式添加另一个要执行的命令吗?

说我跑了

$ /bin/myprog
some output...

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

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

Answers:


118

您应该可以在与wait命令相同的shell中执行此操作:

$ 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.

等待命令即可完成任务。
BillThor

有许多的短形式进入背景程序执行诸如的PID %%1$!。提供PID或第二条命令将始终运行很重要。
BillThor

@BillThor-您只是限定答案还是告诉我这个?
slm

我有答案了。平原wait将无法提供所需的结果。通常使用简短形式,因为它们不容易出现错别字。
BillThor

2
让我成为第一个祝贺您获得闪亮新徽章的人:)
terdon

63

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

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

如果您在结束之前再次挂起并使用不同的命令执行相同的操作,mycleanup的初始链接是否会被替换?
Burhan Ali

3
@BurhanAli myprog第二次暂停将导致fg退出代码20终止-非零,因此mycleanup不会执行链接的命令。
2014年

1

不确定您要的内容是否可行,但是如果您仍然具有从中启动程序的外壳程序,则始终可以检查$?上一个进程的退出状态:

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

1
这将起作用,但是他之后必须手动运行它,他想在命令完成后自动运行它。
slm

@slm同意。对于这个确切的问题,我没有解决方案。
Joseph R.

3
wait在Bash中签出命令。
slm

1

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

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

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

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

prog1 && prog2

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

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


这将起作用,但是他之后必须手动运行它,他想在命令完成后自动运行它。
slm

4
@slm只要该命令不读取stdin,就可以在第一个命令运行时输入新命令。一旦第一个命令完成,shell将立即读取它。
BillThor

如果他在后台运行后在外壳中执行任何操作,则很可能已被关闭。至少根据初步。测试到目前为止我一直在做!
slm

2
@BillThor我认为您应该在评论中添加该评论。
Joseph R.

2
是的,使用wait也不理想。IMO的优势在于,它为我们提供了更清晰的API。在某些程序运行后,在命令行上键入更多命令对我来说似乎有点不客气。wait仍然无法获得直接链接到正在运行的PID,并且返回状态。虽然Bash如何实现事情,但这似乎是一个更大的问题:stackoverflow.com/questions/356100/…。因此,这可能是最好的。
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.