我设置了一个 bash 脚本来从远程驱动器复制备份;如果我从终端运行这个脚本,它就可以正常工作,即 $ ./getBackup
;但是,如果我尝试将它放入我的 crontab 中,它就不起作用。
我在这里阅读了一堆问题/答案,包括
- Cannot run bash script from crontab when it works from command line bash
- the script runs from command line but crontab fails
- Script does not run under cron but runs manually
也许我错过了什么,但我想我已经尝试了其中提供的大部分建议,以及我能想到的几乎所有其他建议。我试图从我的 crontab、sudo crontab、/etc/crontab 运行它;我已经检查了终端的环境(脚本手动工作的地方)并将其放入 cron 作业的脚本中。
有人有什么想法吗?
[编辑添加] 一些评论者要求提供有问题的代码,因此:
定时任务:
30 9 * * * /home/opsmonitor/Documents/getBackup
获取备份
cd /home/opsmonitor/Documents/
OF=backup-$(date +%Y%m%d)
echo "Retrieving backup file $OF"
scp root@IP ADDRESS HERE://opt/backups/backupsbydate/$OF.tgz $OF.tgz
正如我所说,getBackup 在命令行中运行良好;并从 crontab 运行,它什么都不做。 (现在我将输出重定向到一个文件, echo 确实打印到那个文件。)
由于 scp 从命令行运行,我认为这是一个环境问题,但正如我所说,我在脚本中添加了很多环境变量——它仍然可以从命令行正常运行,但从定时任务。
最佳答案
我通过在删除额外环境变量的脚本中运行我的程序来测试环境方面。这是一个示例(请注意,它实际上单独保留了 PATH
— 并不是您想要的):
#!/bin/sh
# $Id: noenv,v 1.3 2014/05/10 22:43:32 tom Exp $
# trim the environment to minimal (PATH may still be long...)
env | sed -e 's/=.*//' -e '/^[ ].*/d' | \
while true
do
read value
if test -z "$value" ; then
# honor assignments to variables in the parameter list
while test $# != 0
do
case "x$1" in
*=*)
eval $1
name=`echo "$1"|sed -e 's/=.*//'`
export $name
shift 1
;;
*)
break
;;
esac
done
exec "$@"
break
fi
case "$value" in
HOME|PATH|USER|_|SHLVL|TMPDIR|LOGNAME)
;;
*\ *|*\(*|*\)*|*\!*)
#echo "...skipping $value"
;;
*)
#echo value:"$value"
unset "$value"
;;
esac
done
然后调用那个noenv
,就可以了
noenv ./getBackup
但是,如果您的程序仍然可以从命令行正常运行,我怀疑它会尝试使用 /dev/tty
等,如果没有找到终端。这是 cron 中不太常见的问题,但已在例如 Linux: Difference between /dev/console , /dev/tty and /dev/tty0 中注明。 .
关于linux - Bash 脚本独立运行,不能在 crontab 中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30041417/