linux - Bash 脚本独立运行,不能在 crontab 中运行

标签 linux bash shell cron

我设置了一个 bash 脚本来从远程驱动器复制备份;如果我从终端运行这个脚本,它就可以正常工作,即 $ ./getBackup;但是,如果我尝试将它放入我的 crontab 中,它就不起作用。

我在这里阅读了一堆问题/答案,包括

也许我错过了什么,但我想我已经尝试了其中提供的大部分建议,以及我能想到的几乎所有其他建议。我试图从我的 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/

相关文章:

linux - 为什么超时在这个期望脚本中不起作用?

linux - bash: child setpgid (5870 to 5870): docker 上没有这样的进程

shell - 将多个日期作为参数传递给 Hive 查询

linux - shell命令末尾的 "/dev/null"是什么意思

c - Linux内核中奇怪的死锁

linux - 如何从文本文件追加和打印数字?

linux - linux中ps和ps -e命令有​​什么区别

linux - Bash:使用新的 PGID 生成一个进程

linux - 我可以使用多少个管道有限制吗?

arrays - shell中输入的数字