前情提要
日常服务器运维中,针对同组多个服务,如果通过批量操作,可以有效提升维护效率。
故编写以下实用工具脚本用于批量管理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-enable、batch-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 脚本中使用,用于处理变量的默认值逻辑。它们提供了一种方便的方式来检查和设置变量值,从而使脚本更加灵活和健壮。


评论区