是否可以编辑发送到后台的进程的命令行,或者在第一个命令退出后链接另一个命令来执行?
例如:我开始使用 镜像网站,wget -m site.com
但后来意识到我想在作业执行时通过电子邮件收到通知。该作业在后台运行(bg
)。我如何将 添加&& sendmail
到命令中,或者在第一个命令执行完成后执行它?
答案1
如果您仍然拥有启动原始命令的会话,并且您只想知道它何时完成,那么您可以使用wait
它将等待指定的子进程完成。假设使用bash
类似...
$ ./30s &
[1] 32135
$ wait %1 && echo hello
[1]+ Done ./30s
hello
...echo
用更有用的通知替换命令。
这不会为您提供原始命令的任何输出,但会提供一种在完成时通知的简单方法。
如果您不再具有启动原始命令的会话,那么您需要编写一个脚本来监视该过程是否消失。
答案2
没有任何内置方法可以做到这一点。不过,我只需运行一行代码即可实现您的需要。
但是您需要知道 bg 进程的进程 ID(就您的情况而言wget
)。您可以运行ps aux | grep wget
一旦有了 PID,您就可以使用wait
。但是,如果您关闭了前一个 shell 或会话,则此方法无效。
在这种情况下,我将使用ps -p PID
循环while
在进程处于活动状态时触发睡眠,并在进程停止while
语句结束后,shell 将执行您的sendmail
命令。
完整代码如下:
while ps -p YOUR-PID > /dev/null; do sleep 1; done && echo "Subject: WGET DONE!" | sendmail [email protected]
上述代码的总结:当您选择的 PID 进程运行时,while
条件变为真,循环继续执行sleep 1
,并每秒检查一次其条件。但是,如果进程结束,while
条件变为假,while 循环将结束。shell 将执行 && 之后的命令,即sendmail
答案3
简短的回答是:你不能。
长答案:您可以尝试连接调试器(strace、gdb)并以此方式获取输出,然后邮寄该信息。但首先您会得到不同的输出格式,其次这有各种各样的东西,但用处不大。