【发布时间】:2013-10-06 09:58:03
【问题描述】:
我正在尝试编写一个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 作业中用于在分离的 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 中的子shell 有关,但我不确定问题出在哪里。
可以做些什么来完成这项工作?
【问题讨论】:
-
如果在运行命令之间添加几秒钟的延迟,行为会改善吗?
-
没有。从命令行重复发出相同的命令时,每次之间等待几秒钟,发送电子邮件的概率保持不变。
标签: linux macos bash gnu-screen subshell