我有 Centos 7+ 系统,它们都使用 systemd。有时,在重要的系统更改之后继续进行的最佳方法是重新启动每个当前正在运行的服务。如果我每次重新启动每个服务,那么系统通常会保持在线状态,并且很容易看到出现的服务问题。所以我破解了这个小 bash 脚本,它重新启动每个正在运行的 systemd 服务,除了某些命名服务,我认为这些命名服务是保持机器在线的核心。
#!/bin/bash
set -e
set -u
running=$(systemctl list-units --type service | grep running \
| grep -iv audit \
| grep -iv disk \
| grep -iv drive \
| grep -iv getty \
| grep -iv irq \
| grep -iv libstoragemgt \
| grep -iv lvm \
| grep -iv multipath \
| grep -iv polkit \
| grep -iv storage \
| cut -d' ' -f1)
for service in $running ; do
echo "$service"
systemctl restart "$service"
done
有几件事我希望更好:
- Grepping for "running" 是过滤正在运行的任务的粗略方法,多个管道非常昂贵。
- 使用
cut
真的很脆弱,当 systemd 的输出格式发生变化时会中断。 systemctl restart
启动失败时不会设置返回码,因此即使服务无法停止或启动,脚本也会继续运行。
有什么更好的方法可以做到这一点?
重新启动服务器:)
重新启动所有服务很少是一个好主意。要么你正在更新整个系统,然后你想确保你所有的东西都使用最新的补丁库。或者您只更新/重新配置一项服务,然后一个简单的
systemctl reload whatever.service
就足够了,无需重新启动所有正在运行的服务。此外,不时重新启动服务器以确保它实际上是可重新启动的,这是一个好主意。我见过有多年正常运行时间的服务器,没有人敢重新启动,因为没有人知道它们是否真的会恢复,做了哪些更改但没有保存,等等。
如果它是一个关键系统,它肯定在某个高可用性集群中,重新启动一个节点并不重要。如果它不是一个关键系统,您可以重新启动它,即使是在工作时间之后或周末。
所以回答你的问题 -重新启动服务器
要改进您的代码,您可以执行以下操作:
--state running
而不是grep running
过滤您需要的服务。grep -v -f exclude-services.list
链grep
systemctl try-restart s1 s2 s3 ...
all 而不是遍历列表。首先列出要排除的服务
exclude-services.list
:然后这个脚本应该工作:
这可能比您的脚本更强大。让我知道事情的后续。