【问题标题】:Bash script fails in crontab due to script/executable paths not being fully qualified由于脚本/可执行路径未完全限定,Bash 脚本在 crontab 中失败
【发布时间】: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=....

标签: linux bash shell cron


【解决方案1】:

您可以尝试将 Bash 作为登录 shell 运行:

0 1 * * * bash -l /opt/minecraft/scripts/backup_server.sh proxy

与您习惯的环境相比,这样您可以获得更完整的环境。

解释见手册:https://www.man7.org/linux/man-pages/man1/bash.1.html#INVOCATION

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 2013-04-19
    • 1970-01-01
    • 2021-05-01
    • 2017-12-02
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多