CentOS9
牢记这个问题:https://serverfault.com/questions/1099284/centos-how-to-keep-previous-service-state-on-reboot
似乎无法实现我所需要的。那是对的吗?
我需要什么 - 运行一个脚本来停止服务,收集和压缩日志,然后更新操作系统并重新启动(如果有内核更新)。我的问题是重启后服务再次启动。这是不可取的。
解决这个问题的一种方法是以某种方式让 CentOS 在这次特定的重新启动(而不是任何重新启动)上运行脚本。因此,该脚本只能在从上述脚本重新启动后运行。脚本再次停止服务..
有办法这样做吗?
答案1
您可以使用“标志”文件和@reboot
cron
作业:
#!/bin/bash
# flag file must exist across reboots
flag="/tmp/myflagfile"
#
# if there is no $flag, this is the 1st time
if [[ ! -f "$flag" ]] ; then
touch "$flag"
do_firsttime
else
rm "$flag"
do_secondtime
fi
您可以通过创建(或不创建)$flag
文件来控制行为。
答案2
不确定我是否理解您的需求,但我看到有两种方法可以实现您所描述的操作:
- 制作一个“正确关闭”脚本。从中管理日志,设置下次运行的文件标志(下次启动时启动脚本将读取该标志),管理服务等。然后从脚本本身进行关闭。脚本准备好后,转到您正在使用的 WM 并放置该脚本而不是正常的关机按钮。
- 编写一个应用程序(C 是最简单的)来捕获 SIGTERM、SIGINT 等 (
man 7 signal
)。在机器启动时将该应用程序作为恶魔启动。一旦应用程序捕获 SIGTERM - 调用日志收集脚本。
如果您需要该脚本不在下一个工作会话中运行,您可以随时将其设置为服务并接受正常的服务管理 ( man systemd
)。或者您的脚本可以检查某些标志文件是否存在 - 如果存在,则立即退出并删除(或不删除)该标志文件(这将影响下一个会话)。
答案3
我已将脚本拆分为两个不同的作业。一个正在运行操作系统更新并重新启动,另一个(一小时后)是日志收集/压缩所需的任何内容。