因此,我需要对启动脚本进行修改,以便在应用程序完全加载后清理 /tmp。经过一番研究,我找到了一个可以执行此操作的脚本命令:
tail -f /home/user1/logs/application.log | awk '/Application is fully up and running/ { system("pm2 restart cleantmp"); exit 1; }'
echo "Startup complete"
基本上,它检查脚本的每个换行符是否存在“应用程序完全启动并运行”模式,当发生这种情况时,使用 pm2 重新启动我们的清理过程。
这似乎可以在应用程序启动后清理 /tmp 。但是,我遇到了一个问题,控制台将挂在那里,向我显示服务器输出,并且永远不会退出。它不会失败或因错误而失败;它根本就永远不会到达 echo 语句,并等待我使用 CTRL+C。
根据我对此网站的研究,我尝试了使用 tail 和 sed 的其他版本:
tail -f /home/user1/logs/application.log | grep --line-buffered -q 'Application is fully up and running' | while read ; do pm2 restart cleantmp ; done
tail -f /home/user1/logs/application.log | sed "/Application is fully up and running/q"
在这两种情况下,脚本甚至都没有进行清理。使用“ps -aux | grep tail”进行进一步测试表明,这肯定是tail -f
阻止脚本完成的原因。有人有过类似的用例吗?任何建议将不胜感激。
答案1
和
tail -f /home/user1/logs/application.log |
grep --line-buffered -q 'Application is fully up and running' |
while read ; do pm2 restart cleantmp ; done
您使用-q
告诉grep
不产生任何输出,然后将任何内容通过管道传输到尝试读取它的循环。你可以尝试这样做:
tail -f /home/user1/logs/application.log |
grep --line-buffered -q -m 1 'Application is fully up and running'
pm2 restart cleantmp
但在下一行写入输入文件之前,尾部不会终止,我认为您的问题陈述不会发生这种情况,因此您可以从查找字符串的脚本中将一个空行写回输入文件您正在该脚本退出之前寻找:
file='/home/user1/logs/application.log'
tail -f "$file" |
awk -v file="$file" '/Application is fully up and running/{exit} END{print "" >> file}'
pm2 restart cleantmp
这有点 hacky,但只要您不介意将空行附加到输入文件中,就应该可以工作。
最后,我认为最简单的解决方案是忘记tail
并每秒在无限循环中调用 awk 一次,直到出现您想要的字符串,然后跳出循环:
while :; do
awk '/Application is fully up and running/{f=1; exit} END{exit !f}' && break
sleep 1
done < '/home/user1/logs/application.log'
pm2 restart cleantmp
最后假设您要查找的最终消息作为单行写入日志文件。