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