3

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

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

例如:

cp My_Huge_File.txt New_directory &

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

感谢您的任何建议!

4

4 回答 4

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使用管道进入另一个进程。如果您希望使用多个管道,这也是一个有用的工具。作为参考,这里有更多 I/O 重定向的示例。|tee

于 2013-08-30T15:36:57.027 回答
2

您可以使用命令分组:

{ slow_program; echo ok; } &

或等待命令

slow_program &
wait
echo ok
于 2013-08-30T15:35:56.293 回答
1

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

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

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

“这是 mthis 是我的 string2y string1”

代替:

this is my string1
this is my string2

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

于 2013-08-30T15:39:49.903 回答
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
$ 
于 2013-08-30T16:47:35.780 回答