2013-08-30 156 views
3

我发现在SE上有关于完成后台任务时的通知以及如何在其他人结束后排队开始工作以及像these这样的问题的其他几个问题,但我正在寻找一个更简单问题的简单答案。如何在后台进程完成后获取stdout消息?

我想开始一个非常简单的后台工作,并获得一个简单的标准输出文本通知其完成。

例如:

cp My_Huge_File.txt New_directory & 

...当它完成后,我的bash shell中会显示一条消息。这个消息可能只是完成的作业的PID,但是如果我可以为每个后台进程编写独特的消息,那也会很酷,所以我可以运行许多后台作业而不会混淆。

感谢您的任何建议!

+2

我的Mac上的'bash'已经告诉我何时完成后台作业。这在更新的版本中有所改变吗? –

回答

2

你可以使用命令分组:

{ slow_program; echo ok; } & 

或等待命令

slow_program & 
wait 
echo ok 
+0

这几乎是完美的,尤其是命令分组方法,但是在收到“OK”消息后,我必须按Enter键清除命令!我知道这是一个小问题,但如果在我疯狂地输入命令时后台进程结束,我可以预见这可能会打断事情。任何方式可以简单地打印回显消息而不需要用户输入? – jake9115

+1

@ jake9115它实际上并不需要使用输入,但它会在打印提示后回显输出,因此看起来您没有任何提示。你可以输入下一个命令而不需要输入 – user000001

4

编辑: user000001的答案与;分离的命令。我在原始示例中将命令与&&分开。我注意到的唯一区别是,如果您使用&&,则不必使用大括号将您的基地命令包围。分号更灵活一些,所以我更新了示例。

,想到的第一件事是

{ sleep 2; echo "Sleep done"; } &

您还可以抑制来自上面的行stderr输出随行:

{ { sleep 2; echo "Sleep done"; } & } 2>/dev/null

如果你想保存程序输出(stdout)到日志文件供以后查看,您可以使用:

{ { sleep 2; echo "Sleep done"; } & } 2>/dev/null 1>myfile.log 

这里甚至你可以使用一个通用的形式(你甚至可以使一个别名,这样就可以在任何时间运行,而不必键入这么多!):

# dont hesitate to add semicolons for multiple commands 
CMD="cp My_Huge_File.txt New_directory" 
{ eval $CMD & } 2>/dev/null 1>myfile.log 

您还可能管stdout如果您希望使用其他脚本或软件实时处理输出,请使用|。如果您想使用多个管道,tee也是一个有用的工具。仅供参考,I/O重定向here还有更多示例。

+0

你能指定我的命令在你的答案中的位置吗?例如: – jake9115

+0

ex:'{cp My_Huge_File.txt New_directory;回声“复制完成!”; }&' – collinjsimpson

1

最可靠的方法是简单地将后台进程的输出转移到临时文件,然后使用临时文件。

当你运行一个后台进程可能很难捕获输出到一些有用的东西,因为多个就业岗位将覆盖海誓山盟

举例来说,如果你有两个过程,每个打印出的字符串中包含数字“这是我的字符串1" ,‘这是我的字符串2’,那么有可能你用看起来像这样的输出结束:

‘这是mthis是我string2y字符串1’

inste广告:

this is my string1 
this is my string2 

通过使用临时文件,你可以保证输出是正确的。

+0

感谢您的提示。出于这个原因,我不会尝试将输出打印到标准输出,但只是想要一条消息让我知道完成的过程。 – jake9115

0

正如我在上面的评论中提到的,bash默认情况下已经进行了这种通知,据我所知。下面是我刚刚制作的一个示例:

$ sleep 5 & 
[1] 25301 
$ sleep 10 & 
[2] 25305 
$ sleep 3 & 
[3] 25309 
$ jobs 
[1] Done     sleep 5 
[2]- Running     sleep 10 & 
[3]+ Running     sleep 3 & 
$ : 
[3]+ Done     sleep 3 
$ : 
[2]+ Done     sleep 10 
$ 
相关问题