![制作“at”或“sleep”实用程序以在最高的 Bash 会话中超时打印标准输出](https://linux22.com/image/101819/%E5%88%B6%E4%BD%9C%E2%80%9Cat%E2%80%9D%E6%88%96%E2%80%9Csleep%E2%80%9D%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%BB%A5%E5%9C%A8%E6%9C%80%E9%AB%98%E7%9A%84%20Bash%20%E4%BC%9A%E8%AF%9D%E4%B8%AD%E8%B6%85%E6%97%B6%E6%89%93%E5%8D%B0%E6%A0%87%E5%87%86%E8%BE%93%E5%87%BA%20.png)
我想在当前时间提前 2 小时(即超时)执行一组命令。
当这些命令超时时,我需要继续定期使用 Bash(即这些命令需要在后台运行,就像 一样
&
)。最后,我需要将命令的标准输出打印到所有会话层次结构中最高的会话终端。
为什么我想这样做:
出于安全原因,我需要将此作为安装 PHPmyadmin (PMA) 的脚本的一部分,然后在 2 小时后将其删除。这个解决方案是信息安全领域的几个人向我推荐的(如果它与端口3306的过滤一起,有些人还会添加HTTPS)。
一开始似乎是解决方案:
sleep
我可以使用或实用程序使命令超时at
,请参阅:
cat << EOF
sudo nohup sleep 2h
echo "hello"
echo "welcome"
EOF
或者:
cat << EOF | sudo at 'now + 2 hours'
echo "hello"
echo "welcome"
EOF
这些方法的问题(事实上):
问题是这些命令不在后台运行,并且它们的标准输出不会打印到层次结构最高的会话的终端。
笔记:
- 我说“最高会话”或“层次结构中最高的会话”或“第一个会话”只是为了强调命令的原始会话可能会由于无意或有意关闭会话窗口(或其他类似原因,例如突然重新启动)而丢失或 2 分钟断电),在这种情况下,我可能会启动另一个会话,这将是会话层次结构中的第一个会话,前命令的超时时间为 2 小时。
答案1
Linux 以文件形式处理从设备到tty
存储的所有内容。
所以我建议将输出发送到一个文件,如下所示tty
:
cat << EOF | sudo at 'now + 2 hours' | tee /var/tmp/at_output.log
echo "hello"
echo "welcome"
less /var/tmp/at_output.log
EOF
现在您需要做的就是在屏幕会话中或通过文本查看器(如 cat 或 tail)查看输出文件。
例如,只需tail -f /var/log/at_output.log
从当前运行tty
,它就会向您显示从最后 10 行开始的实时输出。
当您切换到一个时,您还可以在 a 中查看它screen
,您首先需要创建:
要创建screen
会话类型:screen -S at_proc
您将看到一个screen
便携式会话,tty
允许您连接和断开连接,而不会中断命令运行并保留历史记录,在这里您将能够不间断地运行命令。
要断开screen
会话,只需点击ctrl+ a+ d。
要重新连接到会话,只需键入screen -r at_proc
,或者如果它是唯一的会话,则只需键入screen -r
。
当您完成屏幕会话后,只需重新连接它并键入exit
或按ctrl+键d,就像在常规tty
.