脚本通过cron不同的行为
编辑:更新,以反映一些答案脚本通过cron不同的行为
我有这个剧本,我家的电脑上test.sh:
注:$ USER =约翰
#!/bin/bash
/usr/bin/scp -q [email protected]:/home/$USER/tmp/$USER /home/$USER/tmp/ > /dev/null 2>&1
error_code="$?"
if [ "$error_code" != "0" ]; then #if file NOT present on mysite then:
echo "File does not exist."
exit
fi
echo "File exists."
现在,可以说我在服务器mysite.com上创建文件,如下所示:
echo > tmp/$USER
现在,当我运行上面的sc手动在我的桌面上撕下,如下所示:
./test.sh
我得到结果“文件存在”。
但是,如果我可以通过crontab运行它,我得到的结果“文件不存在” 我的crontab是这样的:
* * * * * /home/user/test.sh >> /home/user/test.log 2>&1
我花了一整天来检查逻辑和一切。 ..我似乎无法弄清楚为什么这样。感谢事先你的帮助:)
编辑:SCP看起来mysite.com:/home/$USER/tmp/ DIR 我的台式机和服务器上的$ USER是一样的。所以我不认为这是一个亲缘问题。 如果我
ssh [email protected]
,然后做
ls tmp/
我去看看那里的文件。
此外,crontab条目位于我的crontab中,而不是其他用户或root的crontab。
@Jonathan:我设置了基于密钥的身份验证。无需密码!
@netcoder:在我的日志文件中,我看到“文件不存在”的重复行。
@sarnold:在我的scp系列中,我已经把[email protected],只是为了确保在crond运行脚本时,cron在mysite.com上使用john的帐户。仍然是相同的结果。
我希望问题就在这里:mysite.com:tmp/$USER
- tmp/
是相对于当前工作目录的相对路径。当您的代码通过crond(8)
执行时,您的cwd
可能与手动执行时不同。
作为@netcoder points out in his comment,绝对路径是使用crontab(5)
文件执行的脚本/程序的最佳方式。
在cron下运行时,您的$USER
环境变量可能未设置,可能会出现问题。
你可以尝试添加这样的事情你的脚本:
echo "User: $USER" > /tmp/crontest.log
得到cron来运行该脚本后,看看是什么/tmp/crontest.log
如果什么都没有设置你可能想要尝试这样的事情:Where can I set environment variables that crontab will use?
你试过'scp'(ie:'/ usr/bin/scp')或'/ tmp'的绝对路径吗?你用什么用户运行cron?什么是cron的工作目录? test.log中有什么? – netcoder
和@ netcoder的问题的附件 - “/ dev/null”中有什么?既然它不会告诉你,我建议你在一个文件中捕获标准输出和标准错误,这样你就可以看到你需要的信息是否在那里。例如,'scp'如何知道使用哪个密码? –