当cron在我的用户ID下启动命令时,它实际上在文件系统中的哪个位置启动它?
假设我有这个python脚本:
import sys
filepath = sys.argv[1]
try:
fp= open(filepath)
... stuff ...
except:
print ("File not found.")
并且我在crontab中调用脚本:
0 2 * * /home/me/scripts/bla.py filename
文件“文件名”位于/ home / me / scripts中。这给了我“找不到文件”消息。所以很明显,我的脚本在/ home / me / scripts之外的其他地方启动了。但是哪里?我可以将绝对路径放入crontab中,但是当给出多个参数时,这会很混乱。最好的把戏是什么?
您没有说您正在使用什么系统,但是在我使用过的每个系统上,cron
都会启动作业,并将其当前工作目录设置为用户的主目录。某些系统将在其cron
或crontab
的手册页中记录该行为,但是如果不这样做(或如果您想确定),则很容易检查系统情况。只需将其添加到您的crontab中:
* * * * * /bin/pwd > $HOME/cron-pwd.txt
并等待一分钟左右,以便cron-pwd.txt
文件出现在您的主目录中。而且,显然,在读取文件后,从crontab
中删除该行。
这意味着您的crontab命令行可以使用相对于您的主目录的路径名:
0 2 * * * scripts/bla.py scripts/filename
或者您可以通过使用$HOME
环境变量来构建绝对路径:
0 2 * * * $HOME/scripts/bla.py $HOME/scripts/filename
或者,如果重复写出路径不方便,那么您可以在作业开始运行将执行实际工作的程序之前更改其自己的工作目录:
0 2 * * * cd $HOME/scripts ; ./bla.py filename
cron
的某些实现具有可以影响初始工作目录的增强功能,例如让您指定与实际主目录不同的HOME
环境变量。我不建议您使用该功能在特定目录中启动您的工作,除非您非常确定自己在做什么,因为设置非标准$HOME
可能会对执行为工作的一部分。
顺便说一句,您的问题在crontab行的开头只有0 2 * *
,缺少一个字段。我认为那只是一个复制粘贴错误。另外,它不会调用Python来运行脚本。我认为这也是一个复制粘贴错误,或者您的真实脚本有一个#!
行来调用您的Python解释器。