侧边栏壁纸
博主头像
Ivan Zhang

所谓更牛,就是换个罪受

  • 累计撰写 48 篇文章
  • 累计创建 54 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

Linux 批量管理 systemd 服务的实用工具

Ivan Zhang
2024-01-23 / 0 评论 / 0 点赞 / 595 阅读 / 2,719 字
温馨提示:
本文最后更新于 ,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
有什么问题或观点欢迎评论留言,或者 交流。
如果觉得文章对您有所帮助,可以给博主打赏鼓励一下。

前情提要

日常服务器运维中,针对同组多个服务,如果通过批量操作,可以有效提升维护效率。
故编写以下实用工具脚本用于批量管理 systemd 服务。

脚本内容

#!/bin/bash

# 检查当前用户是否为 root 用户
if [ "$(whoami)" != "root" ]; then
    echo "请使用 root 用户执行脚本!"
    exit 1
fi

# 创建别名文件 `/root/.bash_batch_services`
cat > ~/.bash_batch_services << EOF
## 批量操作指定前缀的服务
# 默认前缀: cloud-
# 默认操作: status
batch_systemctl() {
    local action="\${1:-status}"
    local prefix="\${2:-cloud-}"
    systemctl list-unit-files \\
        | awk -v prefix="\$prefix" '(\$1 ~ "^" prefix) && (\$1 ~ /.*\.service$/) {print \$1}' \\
        | xargs -I {} systemctl "\$action" {}
}

alias batch-enable='batch_systemctl enable'
alias batch-disable='batch_systemctl disable'
alias batch-start='batch_systemctl start'
alias batch-stop='batch_systemctl stop'
alias batch-status='batch_systemctl status'
alias batch-restart='batch_systemctl restart'
EOF

grep -cw "~/.bash_batch_services" ~/.bashrc | xargs -i [ {} -eq 0 ] && cat >> ~/.bashrc << EOF
# Source global definitions
if [ -f ~/.bash_batch_services ]; then
        . ~/.bash_batch_services
fi
EOF

echo "请手动执行 source ~/.bashrc 使配置生效!!!"

解析与使用说明

下面是脚本的详细解析和用法说明:

该脚本定义了一个名为 batch_systemctl 的函数,用于执行 systemctl 命令对符合条件的服务进行批量操作。函数的定义如下:

batch_systemctl() {
    local action="${1:-status}"
    local prefix="${2:-cloud-}"
    systemctl list-unit-files \
        | awk -v prefix="$prefix" '($1 ~ "^" prefix) && ($1 ~ /.*\.service$/) {print $1}' \
        | xargs -I {} systemctl "$action" {}
}
  • local action="${1:-status}":这行代码设置了一个名为 action 的局部变量,它表示要执行的 systemctl 子命令。如果没有传递第一个参数,则使用默认值 status
  • local prefix="${2:-cloud-}":这行代码设置了一个名为 prefix 的局部变量,它表示服务名称的前缀。如果没有传递第二个参数,则使用默认值 cloud-
  • systemctl list-unit-files:这是一个 systemctl 命令,用于列出当前系统上所有的 Systemd 服务。
  • awk -v prefix="$prefix" '($1 ~ "^" prefix) && ($1 ~ /.*\.service$/) {print $1}':这是一个 awk 命令,它在 systemctl 输出的服务列表上执行过滤和处理操作。awk 使用变量 prefix 来过滤以指定前缀开头,并以 .service 结尾的服务,并将匹配到的服务名称打印出来。
  • xargs -I {} systemctl "$action" {}:这是一个 xargs 命令,它将通过管道传递过来的服务名称作为参数传递给 systemctl 命令,并执行传递的 action 子命令。

此外,脚本还定义了一系列别名,用于执行特定的批量操作,例如 batch-enablebatch-disable 等。这些别名直接调用了 batch_systemctl 函数,并将相应的子命令作为参数传递给它。

用法示例:

  • batch-enable: 启用所有以默认前缀 cloud- 开头且以 .service 结尾的服务。
  • batch-disable:禁用所有以默认前缀 cloud- 开头且以 .service 结尾的服务。
  • batch-start: 启动所有以默认前缀 cloud- 开头且以 .service 结尾的服务。
  • batch-stop: 停止所有以默认前缀 cloud- 开头且以 .service 结尾的服务。
  • batch-status: 查看所有以默认前缀 cloud- 开头且以 .service 结尾的服务的状态。
  • batch-restart:重启所有以默认前缀 cloud- 开头且以 .service 结尾的服务。

你可以根据需要修改前缀(如:batch-status cron)或调用不同的别名以执行特定的操作。

补充说明

${var:-default} 是一种固定的语法,用于设置变量的默认值。除了 ${var:-default},在变量扩展中还有其他几种类似的用法可以设置默认值:

  • ${var-default}: 如果 var 为空或未设置,则使用 default 设置变量的值。
  • ${var:=default}: 如果 var 为空或未设置,则使用 default 设置变量的值,并将其赋值给 var
  • ${var:+value}: 如果 var 非空,则使用 value 设置变量的值。
  • ${var:?message}: 如果 var 为空或未设置,则将 message 输出到标准错误,并退出脚本或当前执行环境。

这些变量扩展形式可以在 shell 脚本中使用,用于处理变量的默认值逻辑。它们提供了一种方便的方式来检查和设置变量值,从而使脚本更加灵活和健壮。

0

评论区