如何从分离的GNU屏幕会话中邮寄命令的输出?

时间:2013-09-30 13:47:02

标签: linux macos bash gnu-screen subshell

我正在尝试编写一个bash脚本,该脚本在screen会话中执行命令,该会话在会话中显示命令的输出,并在完成时通过电子邮件发送。但是,它并不总是有效,我无法解决原因。我已将该行为提炼为以下示例:

命令

ls | tee >(mail -s 'my subject' me@example.co.uk)

每次都很好,

bash -c "ls | tee >(mail -s 'my subject' me@example.co.uk)"

然而,命令

screen -dmS foo bash -c "ls | tee >(mail -s 'my subject' me@example.co.uk)"

有时只能运作。

命令结构的原因是它在cron-job中用于在分离的screen会话中启动脚本(用户可以重新连接以实时查看脚本的输出)以及脚本完成后通过电子邮件发送输出。我在示例中用ls替换了脚本来测试和演示问题。

我使用tail -f /var/log/mail.log来观看发送的邮件。我执行了screen命令十次,只发送了两封邮件。为了更加努力,我做到了这一点:

for i in {1..100}; do screen -dmS test_$i bash -c "ls | tee >(mail -s 'screen test $i' me@example.co.uk)"; done

导致发送100封邮件中的39封。

这最初是在OSX上完成的,但我也在Linux机器上进行了测试,看到了类似的行为。我认为它与screen中的子壳有关,但我不确定问题是什么。

可以做些什么来完成这项工作?

1 个答案:

答案 0 :(得分:0)

我很久以前就问过这个问题,但也许我的回答可以帮助那些找到这些页面的人(比如我)。

我遇到了同样的问题,我从来没有从带有-dmS的守护进程的分离屏幕会话中获得带mail命令的邮件。 mutt命令与mail命令非常类似,很难解决我的问题。以下是我从分离屏幕发送邮件的方式:

screen -dm -S "testMail" bash -c "echo body | mutt -s subject me@example.com"