I needed to find a way to track if my CentOS 7 systems reboot unexpectedly. I was surprised that this isn’t something that the OS does by default. I found this article from RedHat that outlines that you basically have to write a couple of systemd scripts yourself if you want this functionality. So, I did.
I ended up with three separate systemd services that accomplish what I want:
- set_graceful_shutdown: Runs just before shutdown. Creates a file /root/grateful_shutdown
- log_ungraceful_shutdown: Runs on startup. Checks to see if /root/grateful_shutdown is missing and logs this fact to a file (/var/log/shutdown.log) if it is.
- reset_shutdown_flag: Runs after log_ungraceful_shutdown. It checks for the presence of that file, and if it exists, removes it.
I placed these three files into /etc/systemd/system and then ran systemctl daemon-reload & systemctl enable for each one.
set_graceful_shutdown.service
[Unit] Description=Set flag for graceful shutdown DefaultDependencies=no RefuseManualStart=true Before=shutdown.target [Service] Type=oneshot ExecStart=/bin/touch /root/graceful_shutdown [Install] WantedBy=shutdown.target
log_ungraceful_shutdown.service
[Unit] Description=Log ungraceful shutdown ConditionPathExists=!/root/graceful_shutdown RefuseManualStart=true RefuseManualStop=true Before=reset_shutdown_flag.service [Service] Type=oneshot RemainAfterExit=true ExecStart=/bin/sh -c "echo $$(date): Improper shutdown detected >> /var/log/shutdown.log" [Install] WantedBy=multi-user.target
reset_shutdown_flag.service
[Unit] Description=Check if previous system shutdown was graceful ConditionPathExists=/root/graceful_shutdown RefuseManualStart=true RefuseManualStop=true [Service] Type=oneshot RemainAfterExit=true ExecStart=/bin/rm /root/graceful_shutdown [Install] WantedBy=multi-user.target
It feels like a kludge but it works pretty well. The result is I get an entry in a log file if the system wasn’t shut down properly.