【问题标题】:Crontab runs only a part of my scriptcrontab 只运行我脚本的一部分
【发布时间】:2015-01-14 03:10:48
【问题描述】:

我的脚本首先执行两个 python 脚本,它们将温度从传感器写入文件,然后通过 ftp 从 .sh 文件中上传。

由于某种原因,温度仅在我手动运行 .sh 文件时才会更新。当 crontab 运行脚本时,它只上传 ftp,但似乎不运行 python 脚本,除了 take_pic.py。

  1. crontab 从根的 crontab 执行。
  2. python 文件是可执行的
  3. 日志文件不显示任何内容
  4. 如果我手动运行脚本,一切都会完美运行

ftp.sh:

echo "Run :$(date)" >> python_temp.log
python write_temp.py >> python_temp.log

python temp_to_file.py >> python_temp_to_file.log

#raspistill -o snapshot2.jpg -n -w 1280 -h 720

python takePic.py
sleep 3
HOST=XX                #This is the FTP servers host or IP address.
USER=XX                #This is the FTP user that has access to the server.
PASS=XX                #This is the password for the FTP user.
NOW=$(date +"%c")

#    echo beginne upload
    touch work
    ftp -inv $HOST << EOF
user $USER $PASS
cd /bilder/
put snapshot2.jpg
rename snapshot2.jpg snapshot.jpg

put temp.js

bye
EOF
#    echo erfolgreicher upload

temp_to_file.py

import subprocess
import datetime
import sys

output = subprocess.check_output("temper-poll -q -c" , shell=True)
output = output.rstrip()

#write to file


fobj_out = open("temp.js","w")
fobj_out.write('document.write("' + output + '*C ");')
fobj_out.close()

Crontab:

*/5 * * * * /root/ftp.sh

【问题讨论】:

  • 发布您的 crontab 语法。你去过stackoverflow.com/tags/crontab/info吗?有很好的调试信息。
  • 我认为问题在于 subprocess_check_output 不适用于 crontab
  • 您可能需要使用完整路径,因为 crontab 不知道它在哪里运行。检查我提供的链接,有很好的信息。
  • 好吧,正如我所说的,每 5 分钟上传一次。所以我不认为它是 Crontab
  • 如果你想解决这个问题,你可以尝试做一些研究。我向您指出了一些资源,但您似乎没有检查过它们。如果你认为这不是 crontab 的问题,那么只需删除 crontab 标签,这样我们有一些知识的人就不会被打扰。

标签: python linux sh crontab


【解决方案1】:

&gt;&gt; If I run the script manually everything works perfectly

您可以在运行任何命令之前将您的 .bash_profile 包含在 /root/ftp.sh 中。

. /root/.bash_profile

我经常在 cron 作业中遇到这样的问题。当您的配置文件处于活动状态时,您在 shell 中测试它们,并且当 cron 作业运行时,环境(PATH 和其他东西)不可用。

我查看了您的两个脚本,第一个仅使用操作系统命令,但第二个调用 temp-poll,这可能不适用于 cron 作业。

【讨论】:

  • 解决方案是两个答案的组合
【解决方案2】:

这个问题的发生主要是由于脚本文件的权限和脚本文件的所有权。我也面临同样的问题。我发现我的票据所有者不是超级用户e.g. root.

因此,您必须将您的脚本的权限和所有权设置为超级用户。在下面找到。

首先以超级用户身份编辑您的 crontab。

[abc@host] crontab -e

并保存 crontab :wq!

现在为脚本设置权限

[abc@host] chmod +x script.sh
[abc@host] chown root:root script.sh

现在重新启动你的 crontab。

[abc@host] /etc/init.d/crond restart

【讨论】:

    【解决方案3】:

    您的ftp.sh 脚本中是否有shebang,即它是否以您未在此处显示的#!/usr/bin/env bash 行开头?

    如果没有,您要么需要添加它,要么在您的 crontab 中运行 bash /root/ftp.sh。否则您的脚本将无法正确执行。

    【讨论】:

    • 没有解决问题
    【解决方案4】:

    python 解释器很可能找不到你的 takePic.py 脚本。

    因为 cronjob 在用户主目录中执行(例如:/home/myuser/)。所以使用脚本的完整路径:

    python /some/path/takePic.py >> /some/path/python_temp.log
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 2017-12-12
      • 2015-10-05
      • 2017-12-16
      相关资源
      最近更新 更多