我意识到SE上有关于后台任务完成后通知的其他几个问题,以及如何在其他人结束后排队等待工作,以及these之类的问题,但我正在寻找一个更简单的答案一个更简单的问题。
我想开始一个非常简单的后台工作,并获得一个完整的简单stdout文本通知。
例如:
cp My_Huge_File.txt New_directory &
...完成后,我的bash shell会显示一条消息。这条消息可能只是已完成作业的PID,但是如果我可以为每个后台进程编写唯一的消息,那也很酷,所以我可以让很多后台作业运行而不会混淆。
感谢您的任何建议!
答案 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
$