【问题标题】:How to get a stdout message once a background process finishes?后台进程完成后如何获取标准输出消息?
【发布时间】:2013-08-30 15:32:35
【问题描述】:

我意识到 SE 上还有其他几个问题,关于后台任务完成后的通知,以及如何在其他任务结束后排队开始作业,以及像 these 这样的问题,但我正在寻找一个更简单的答案更简单的问题。

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

例如:

cp My_Huge_File.txt New_directory &

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

感谢您的任何建议!

【问题讨论】:

  • 我的 Mac 上的 bash 已经告诉我后台作业何时完成。这在最近的版本中有变化吗?

标签: bash unix background stdout


【解决方案1】:

编辑: 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

【讨论】:

  • 您能否指定我将在您的答案中放置命令的位置?
  • 例如:{ cp My_Huge_File.txt New_directory; echo "Copy complete!"; } &
【解决方案2】:

您可以使用命令分组:

{ slow_program; echo ok; } &

或等待命令

slow_program &
wait
echo ok

【讨论】:

  • 这个近乎完美,尤其是命令分组方式,但是收到“OK”消息后,我必须按回车清除命令!我知道这是一个小问题,但如果后台进程在我疯狂输入命令时完成,我可以预见这可能会中断事情。有什么方法可以让它简单地打印回显消息而不需要用户输入?
  • @jake9115 确实不需要使用输入,但是在提示打印后会回显输出,所以看起来你没有提示。你可以直接输入下一个命令而不用回车
【解决方案3】:

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

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

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

"这是 mthis is my string2y string1"

代替:

this is my string1
this is my string2

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

【讨论】:

  • 感谢您的提示。出于这个原因,我不会尝试将输出打印到标准输出,而只是想要一条消息让我知道该过程已完成。
【解决方案4】:

正如我在上面的评论中提到的,据我所知,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
$ 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多