我正在尝试编写一个bash
脚本,该脚本在screen
会话中执行命令,该会话在会话中显示命令的输出并在完成时通过电子邮件发送。然而,它并不总是工作,我不能解决原因。我已经蒸行为,下面的例子:如何从分离的GNU屏幕会话中发送命令的输出?
命令
ls | tee >(mail -s 'my subject' [email protected])
每次都工作正常,一样
bash -c "ls | tee >(mail -s 'my subject' [email protected])"
但是,该命令只有
screen -dmS foo bash -c "ls | tee >(mail -s 'my subject' [email protected])"
作品有时。
命令结构的原因是它在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' [email protected])"; done
这导致发送了100封邮件中的39封。
这最初是在OSX上完成的,但我也在Linux上测试过,看到类似的行为。我认为这与screen
中的子壳有关,但我不确定问题是什么。
可以做些什么来完成这项工作?
如果在运行命令之间添加几秒钟的延迟,行为是否会改善? –
不可以。当从命令行重复发出相同的命令时,在每个命令行之间等待几秒钟,发送电子邮件的可能性保持不变。 – starfry