编辑命令发送到后台

编辑命令发送到后台

是否可以编辑发送到后台的进程的命令行,或者在第一个命令退出后链接另一个命令来执行?

例如:我开始使用 镜像网站,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)并以此方式获取输出,然后邮寄该信息。但首先您会得到不同的输出格式,其次这有各种各样的东西,但用处不大。

相关内容