linux - 如何从独立的 GNU screen session 中邮寄命令的输出?

标签 linux macos bash gnu-screen subshell

我正在尝试编写一个 bash 脚本,该脚本在 screen session 中执行命令,在 session 中显示命令的输出,并在完成后通过电子邮件发送。然而,它并不总是有效,我也不知道为什么。我已将行为提炼为以下示例:

命令

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 session 中启动脚本(用户可以重新连接以实时查看脚本的输出),并在脚本完成后通过电子邮件发送输出。我已将示例中的脚本替换为 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 有关,但我不确定问题是什么。

可以采取什么措施来实现这一目标?

最佳答案

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

我遇到了同样的问题,只是我从未从使用 -dmS 作为守护进程运行的独立 screen session 中使用 mail 命令收到任何邮件。 mutt 命令与 mail 命令非常相似,很难解决我的问题。以下是我从分离 screen 发送邮件的方法:

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

关于linux - 如何从独立的 GNU screen session 中邮寄命令的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19095897/

相关文章:

swift - 从 macOS 目录中读取元素数组

multithreading - 在Metal中同步网格中的所有线程

bash - 使用后台进程退出 shell 脚本

狂欢 : Adding extra single quotes to strings with spaces

python脚本进程stat停留在Sl上并停止运行

linux - 从 Shell 脚本调用 makefile

linux - 从 Internet 访问 Python Web 应用程序

linux - ls - 在某些目录中不起作用

bash - 将 git hook 提交到 repo

c - 在 Linux 内核中添加头文件路径