我有一个脚本,它每周创建一个新的日志文件,可以使用日志文件参数从其他脚本调用它。它不使用任何参数,而是创建一个带有父进程名称的日志~/bin/log
。这在终端中运行良好,但在 cron 作业中失败,并抱怨该函数default-log
“不是有效的标识符”。
这个函数看起来很简单,但它所做的一切都很好外部函数。我可以轻松解决这个问题,因为该函数只被调用两次,我只需替换整整 2 行,但我还是想了解到底发生了什么。
其他详情:
- 不是 root cron 作业
- cron 任务实际上是一个调用这个脚本(
weekly-log "$LOG"
)但所有的回响路径等在我的调试中看起来很好 - 使用 gnome-schedule 中的“运行选定任务”进行测试。这似乎会产生相同的环境,但您可以看到输出。
- Ubuntu 16.04
#!/bin/bash
#
# Start fresh logfile each Monday using the supplied path/name
# or create in ~/bin/logs with the name of the calling script
LOG=""
PARENT="$(ps -o comm= $PPID)"
DATEFORMAT="+%a %e %b %Y %I:%M:%S %P %Z"
# Thu 26 Jan 2017 01:52:49 pm AEDT
# Debugging—these all look OK
echo "Args: $*"
echo "PPID: $PPID"
echo "PARENT: $PARENT"
echo "HOME: $HOME"
echo "Default LOG: $HOME/bin/log/$(basename "$PARENT").log"
mkdir -p "$HOME/bin/log"
function default-log {
mkdir -p "$HOME/bin/log"
LOG="$HOME/bin/log/$(basename "$PARENT").log"
}
if [ $# -eq 0 ] ; then
echo "No args"
default-log
# mkdir -p "$HOME/bin/log"
# LOG="$HOME/bin/log/$(basename "$PARENT").log"
else
DIR=$(dirname "$1")
# dirname returns "." for invalid path!
if [ ! "$DIR" = "." ] && [ -d "$DIR" ] ; then
LOG="$1"
else
echo "Invalid path"
default-log
# mkdir -p "$HOME/bin/log"
# LOG="$HOME/bin/log/$(basename "$PARENT").log"
echo "Invalid path to log file: $1" 2>&1 | tee "$LOG"
fi
fi
# Create new log or append
if [[ $(date +%u) -eq 1 ]] ; then
echo "--------------------------------" 2>&1 | tee "$LOG"
else
echo 2>&1 | tee -a "$LOG"
echo "--------------------------------" 2>&1 | tee -a "$LOG"
fi
echo $(date "$DATEFORMAT") 2>&1 | tee -a "$LOG"
echo "" 2>&1 | tee -a "$LOG"