【问题标题】:Python script running successfully on command prompt but not in crontabPython 脚本在命令提示符下成功运行,但在 crontab 中没有
【发布时间】:2015-11-28 03:21:10
【问题描述】:

我在 ~home/ 目录中编写了一个 python script.py,它调用位于 ~home/bin 的其他 python 脚本。 当我运行 script.py 时,我能够成功运行它,但是当我在 crontab 中安排 script.py 时,script.py 无法从 bin 目录调用脚本。

Crontab 脚本如下所示:

*/59 * * * * script.py &>~concatenation.log

script.py 调用另一个脚本如下:

subprocess.call('/home/sdcme/bin/nii_mdir_sdcme %s %s' % (a, a), shell=True)

有人可以指出为什么 script.py 不能调用另一个脚本。我怀疑问题出在 PATH 变量或其他类似的东西上,但不知道我应该如何解决这个问题..

谢谢!

编辑:nii_mdir_sdcme 脚本调用位于同一 bin 目录中的另一个脚本 niidicom_sdcme:Crontab 邮件,显示以下错误邮件 -

niidicom_sdcme: Command not found.
niidicom_sdcme: Command not found.

总结:

cronatab-> script.py -> nii_mdir_sdcme -> niidicom_sdcme 问题是nii_mdir_sdcme 无法调用niidicom_sdcme。 但是当我在命令提示符下独立运行 script.py 时,一切正常..

nii_mdir_sdcme 代码:

#!/bin/tcsh
if ($#argv < 2) then
  echo "Usage: nii_mdir_sdcme start_dir# end_dir#"
  exit
else    
 set start = $argv[1]
 set end = $argv[2]

  if ( ! -d ./medata ) then
   sudo mkdir ./medata
 endif
 sudo chown sdcme ./medata
 sudo chgrp users ./medata

 set i = $start
 while ( $i <= $end )
   echo " "
   if ( $i < 10 ) then
     echo "Entering 000$i..."
     cd 000$i
     sudo chmod 777 .
     niidicom_sdcme run0$i
     #mv *+orig.* ../medata
     sudo chmod 755 .
   else
     echo "Entering 00$i..."
     cd 00$i
     sudo chmod 777 .
     niidicom_sdcme run$i
     #mv *+orig.* ../medata
     sudo chmod 755 .
   endif

   cd ..

   @ i++  
 end

结束

【问题讨论】:

  • 您确定 cron 作业 (script.py) 正在运行吗?您可能需要在 crontab 中包含该命令的完整路径。另外,检查第二个脚本的权限。它是否可执行,运行 cron 作业的用户是否可以访问它?
  • cron 是否为此发送了本地电子邮件?使用mailmutt 进行检查。
  • @minopret 我用邮件错误编辑了我的问题
  • 您确定niidicom_sdcme 没有运行吗?该错误看起来像是由niidicom_sdcme 本身打印的,即它找不到run0$irun$i 命令(sh、bash、zsh 在这里产生不同的错误消息)。不相关:&amp;&gt; 看起来像 bash 语法(在 crontab 中明确设置 SHELL),subprocess.call 使用 /bin/sh 如果 shell=True(您可以使用 executable 参数选择其他 shell),您的脚本运行 @987654337 @。确保没有由于 shell 之间的语法差异而导致的错误。
  • @JFSebastian 如果 subporocess.call() 正在调用 sh 脚本,而我的脚本是用 tcsh 编写的,那么包装器 python 脚本 (nii_mdir_sdcme) 在手动运行时应该可以工作。我知道我在重复但我仍然不undertsnding这个问题..

标签: python unix crontab


【解决方案1】:

这可能是$PATH 的问题。有关 cron 用于运行作业的环境,请参阅 crontab(5)。最简单的解决方案之一是调整您的 crontab 条目以提供脚本的完整路径:

59 * * * * /home/sdcme/bin/script.py &>~concatenation.log

还要检查您的电子邮件。 cron 将通过电子邮件将输出和运行作业的任何失败发送给您。如果您的系统上没有邮件服务器,您需要安装和配置一个,以便收到此类通知。

PS. 使用*/59 作为分钟规范意义不大,所以我将其更改为等效的59,如上所述。

【讨论】:

  • 谢谢!我用邮件中显示的错误编辑了我的问题。这是否有助于我们深入了解代码发生了什么。
  • 是的:您的脚本 nii_mdir_sdcme 期望在 $PATH 中找到 niidicom_sdcme,但事实并非如此。也许您想在 crontab 中将 /home/sdcme/bin 添加到 $PATH。
  • 我应该写 $PATH = /home/sdcme/bin 还是 PATH = /home/sdcme/bin.. 后一种情况不起作用,我担心 $PATH 会改变原来的 $PATH 变量。 .
  • @tryeverylanguage:你应该使用PATH=/home/sdcme/bin:/bin:/usr/bin(注意:没有$
  • @tryeverylanguage:你使用envcall()参数吗? print(os.environ['PATH']) 是什么?你在那儿看到/home/sdcme/bin 吗? ls -l /home/sdcme/bin/nii_mdir_sdcme 是什么?您是否看到运行 crontab 命令的用户的可执行权限?
【解决方案2】:

首先使用 crontab -e 退出编辑器使用 :xi 保存并退出 那么你必须从

编辑你的行
*/59 * * * * script.py &>~concatenation.log

*/59 * * * * /usr/bin/python script.py &>~concatenation.log

/usr/bin/python 是你的 python 的路径

希望对你有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2015-10-21
    • 2017-12-04
    • 2014-03-18
    • 1970-01-01
    • 2015-05-12
    • 2017-03-10
    相关资源
    最近更新 更多