在 shell 中,当我在后台运行进程时,如何获取“[作业编号] [PID]”,重定向到文件?

在 shell 中,当我在后台运行进程时,如何获取“[作业编号] [PID]”,重定向到文件?

我想重定向该命令的输出firefox &。我知道添加&意味着我们将在后台运行该命令,当我们使用它时,我们会收到[number of process in background] [PID].这就是我所做的:

firefox & > firefoxFile 

但当我打开时firefoxFile,却发现里面空空如也。我没找到[number of process in forground] [PID]

答案1

在你的评论中你写道

我想找到后台进程的pid和数量

那这个呢

firefox &
pid=$!

echo "The PID for the background process is $pid" >&2

获得 PID 后,您当然可以将其值写入您选择的任何文件中。

答案2

如果您的 shell 是 bash[1],您可以尝试:

exec 3>&2 2>firefoxFile; firefox & exec 2>&3-

这是您的 shell(例如 bash)将[jobnum] pid后台作业通知打印到标准错误,不是火狐浏览器。这个组合暂时将 stderr 重定向到文件firefoxFile,并将该通知捕获到其中Firefox 在其生命周期内将写入 stderr 的任何内容。

[jobnum] Done firefox当后台作业终止时,它不会捕获将打印的 bash。


你的firefox & > file将被解析为两个命令1. firefox &(它将firefox在后台运行)和2. > file(它将截断file而不写入任何内容)。这肯定不是你想要的。

[1]你可以阅读这里为什么这个技巧在其他 shell 中不起作用;虽然可以在 中重定向 stderr zshzsh但不会将其提示和作业通知写入 stderr,而是写入指向当前终端的另一个 fd,专门为此目的而打开。

答案3

这并不准确,但很接近。您只需要添加一点sed

firefox &
jobs -l | grep -E "\[[0-9]+\]\+" > firefoxFile

相关内容