AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 933267
Accepted
Charlweed
Charlweed
Asked: 2018-09-30 12:31:07 +0800 CST2018-09-30 12:31:07 +0800 CST 2018-09-30 12:31:07 +0800 CST

改进此 scipt 以重新启动每个正在运行的 systemd 服务?

  • 772

我有 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启动失败时不会设置返回码,因此即使服务无法停止或启动,脚本也会继续运行。

有什么更好的方法可以做到这一点?

systemd
  • 2 2 个回答
  • 137 Views

2 个回答

  • Voted
  1. potom
    2018-09-30T15:39:05+08:002018-09-30T15:39:05+08:00

    有什么更好的方法可以做到这一点?

    重新启动服务器:)

    重新启动所有服务很少是一个好主意。要么你正在更新整个系统,然后你想确保你所有的东西都使用最新的补丁库。或者您只更新/重新配置一项服务,然后一个简单的systemctl reload whatever.service就足够了,无需重新启动所有正在运行的服务。

    此外,不时重新启动服务器以确保它实际上是可重新启动的,这是一个好主意。我见过有多年正常运行时间的服务器,没有人敢重新启动,因为没有人知道它们是否真的会恢复,做了哪些更改但没有保存,等等。

    如果它是一个关键系统,它肯定在某个高可用性集群中,重新启动一个节点并不重要。如果它不是一个关键系统,您可以重新启动它,即使是在工作时间之后或周末。

    所以回答你的问题 -重新启动服务器

    • 1
  2. Best Answer
    potom
    2018-09-30T15:59:51+08:002018-09-30T15:59:51+08:00

    要改进您的代码,您可以执行以下操作:

    1. 使用 systemctl's--state running而不是grep running过滤您需要的服务。
    2. 使用而不是grep -v -f exclude-services.list链grep
    3. 一次使用systemctl try-restart s1 s2 s3 ...all 而不是遍历列表。

    首先列出要排除的服务exclude-services.list:

    potom@vm /tmp $ cat exclude-services.list 
    audit.service
    disk.service
    drive.service
    getty.service
    irq.service
    libstoragemgt.service
    lvm.service
    multipath.service
    polkit.service
    storage.service
    

    然后这个脚本应该工作:

    potom@vm /tmp $ cat restart-all.sh
    RESTART_SERVICES=$(systemctl list-units --type service --state running | \
        awk '$1 ~ /\.service/{print $1}' | \
        grep -v -f exclude-services.list )
    
    systemctl try-restart ${RESTART_SERVICES}
    

    这可能比您的脚本更强大。让我知道事情的后续。

    • 0

相关问题

  • SSH 会话在关机/重启时挂起

  • 我可以使用 systemd 重新启动依赖服务吗?

  • 让我的旧初始化脚本在 systemd 中工作的最简单方法是什么?

  • 在 CentOS 7 上为 systemd 启动的进程增加 nproc

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve