我正在编写一些 shell 脚本,旨在监视高可靠性 Linux 系统(kernal 5.0.19)并采取纠正措施。这些操作之一是在某些情况下重新启动系统。
按照我编写重新启动代码的方式,我将调用置于后台,/sbin/reboot now &
以便在之后立即开始在代码中执行其他操作。我担心这种背景可能会产生一些我并不完全理解的含义。谷歌搜索没有给我任何关于此的真实信息。任何人都可以提供任何关于在 Linux 中后台重新启动或关闭命令是好还是坏的决定的知识或意见吗?
额外细节 根据我上面规定的指令,我编写的这个重新启动过程必须:
- 尝试正常、安全的重启
- 如果重新启动挂起,请硬重置系统
- 确保在触发硬重置时将内存中的尽可能多的数据写入磁盘。
由于焊接到系统上的硬件看门狗电路,系统的硬重置被触发,这导致每次(〜99.9%)重新启动都充当硬重置+软件看门狗守护进程过程。终止看门狗进程会触发 60 秒倒计时,之后将发生硬重置。
我的代码编写方式是:
- 终止看门狗进程,开始硬重置倒计时
- 尝试正常重新启动并将进程置于后台
/sbin/reboot now &
reboot
假设命令挂起,开始不断同步
这是我的重启功能的相关片段:
# Kill watchdog daemon process(es), this starts 60s countdown to hard reset
pkill -9 watchdog
if (( $? == 0 )); then
logThis INFO "Watchdog processes killed successfully, creatinged \"$watchdogTriggeredFile\""
touch $watchdogTriggeredFile
fi
# Attempt a normal reboot before the watchdog forces ember to reboot
/sbin/reboot now &
# In testing, anytime the watchdog forces a reboot we lose ~15-25
# seconds of logs. This is due to log writes being stored in memory.
# The watchdog process does not call sync before it kills power to the
# system, so anything stored in memory is lost, therefore:
# Constantly write memory to disk until watchdog triggers reboot (60s)
for (( n=0; n<=600; n+=2)); do
# Watchdog forces reboot after 60s, we sleep every .2, 60 / .2 = 300 iterations
# Can't do floating point arithmetic in bash so we use 600 / 2 = 300 instead
# 300 iterations is more than 60s due to context switching and execution time
sync
sleep 0.2
done
那么,在上面的代码中,后台调用是否可能存在任何重大问题,reboot now
以便我可以继续尝试同步?