我可以在重新启动时运行脚本一次吗?

我可以在重新启动时运行脚本一次吗?

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

我已将脚本拆分为两个不同的作业。一个正在运行操作系统更新并重新启动,另一个(一小时后)是日志收集/压缩所需的任何内容。

相关内容