后台进程完成后如何获取stdout消息?

时间:2013-08-30 15:32:36

标签: bash unix background stdout

我意识到SE上有关于后台任务完成后通知的其他几个问题,以及如何在其他人结束后排队等待工作,以及these之类的问题,但我正在寻找一个更简单的答案一个更简单的问题。

我想开始一个非常简单的后台工作,并获得一个完整的简单stdout文本通知。

例如:

cp My_Huge_File.txt New_directory &

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

感谢您的任何建议!

4 个答案:

答案 0 :(得分:4)

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

首先想到的是

{ 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的例子。

答案 1 :(得分:2)

您可以使用命令分组:

{ slow_program; echo ok; } &

或等待命令

slow_program &
wait
echo ok

答案 2 :(得分:1)

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

当你运行后台进程时,很难将输出捕获到有用的东西,因为多个作业会相互覆盖

例如,如果你有两个进程,每个进程打印出一个带有数字的字符串“this is my string1”“这是我的string2”那么你最终可能得到如下输出:

  

“这是我的string2y string1”

而不是:

this is my string1
this is my string2

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

答案 3 :(得分: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
$