【发布时间】:2023-01-18 20:35:16
【问题描述】:
我有一个 bash 脚本,每晚通过 cron 备份 Minecraft 服务器,脚本如下:
#!/usr/bin/env bash
#
# Usage:
# backup_server.sh <name>
#
# Options:
# -h, --help Show this screen.
# --version Show version.
set -euo pipefail
#shellcheck disable=SC1091
source /opt/minecraft/bin/docopts.sh
source /opt/minecraft/scripts/mc_functions.sh
rcon() {
local command=$1
if [ "$server_name" != "proxy" ] && mc_server_online "$server_name" ; then
/opt/minecraft/bin/mcrcon "$command"
fi
}
main() {
local version='1.0.0'
usage=$(docopt_get_help_string "$0")
eval "$(docopts -A ARGS -V "$version" -h "$usage" : "$@")"
local server_name=${ARGS[<name>]}
local source=$MC_SERVER_ROOT/$server_name
local destination=$MC_BACKUP_ROOT/$server_name
[ -d "$source" ] || {
printf "A server named '%s' does not exist.\n" "$server_name" >&2
exit 1
}
mc_set_rcon_credentials "$server_name" || {
printf "Failed to set the rcon credentials for the server '%s'.\n" "$server_name" >&2
exit 1
}
rcon "save-off"
rcon "save-all"
mkdir -p "$destination"
tar -cpvzf "$destination/$(date +%F-%H-%M).tar.gz" "$source" >&2
rcon "save-on"
unset MCRCON_PASS
unset MCRCON_PORT
find "$MC_BACKUP_ROOT" -type f -mtime +7 -name "*.gz" -delete
}
main "$@"
以前,我没有完全限定 source 命令中脚本或 mcrcon 的路径,因为它们在我的路径中,并且脚本在从终端运行脚本时可以毫无问题地找到它们。
但是,当从 cron 运行脚本时,脚本会失败,因为它找不到可执行文件或脚本。我假设这与 cron 无法读取或使用 $PATH 有关?
我的 crontab 看起来像这样:
0 1 * * * bash /opt/minecraft/scripts/backup_server.sh proxy
# There's a few other commands here identical to this one except for the server name.
有人可以解释为什么我在使用 cron 时需要完全限定脚本/可执行文件的路径,或者建议一种不那么乏味的方法来完成这个吗?
【问题讨论】:
-
我看不到您将在脚本中设置 PATH 的位置。如果您在没有明确指定其路径的情况下调用外部命令(即可执行程序),则始终需要正确的 PATH 设置。我建议您在脚本的顶部放置一个合适的
export PATH=....。