由Cron定期调用的Bash脚本运行时Python脚本不执行

时间:2018-05-01 12:30:48

标签: python linux bash shell cron

  

解决了我的问题:我为python脚本提供了执行权限,在/ etc /目录中添加了cron.allow文件(带有文件)   包含唯一的条目“pi”,没有引号,这是我的用户名)   并提供了python脚本的完整路径。我无能为力   确定哪个解决方案有效,所以感谢glenn jackman和   Abhijit Pritam

我有两个python脚本 bash脚本执行。由于我希望每隔几个小时运行一次此脚本,因此我设置了一个Cron作业。 Bash脚本的( run_awsscrubber.sh )作业如下:

  1. 设置环境。
  2. 将Bash脚本运行时写入两个日志文件(一个用于以前的所有运行,另一个用于此运行)。
  3. 使用wget检查IP地址是否已启用。
  4. 如果上传:
  5. 运行脚本imd_aws_parse_rc4.py并在变量中捕获其输出并将其写入日志文件。
  6. 运行脚本gmail_run_alert.py并在变量中捕获其输出并将其写入日志文件。
  7. 清理一些生成的文件
  8. 如果不是:
  9. 运行脚本gmail_run_alert.py并在变量中捕获其输出并将其写入日志文件。
  10. 清理一些生成的文件
  11. imd_aws_parse_rc4.py:此脚本中的代码使用Selenium WebDriver,Firefox,Gecko驱动程序和Beautiful Soup擦除网站以获取信息,并将解析后的数据作为CSV存储在文件中。

    gmail_run_alert.py:此脚本中的代码将CSV文件(如果存在)和当前生成的错误日志通过电子邮件发送给ID。

      

    我正在使用Raspberry Pi 3运行Raspbian Stretch。

    手动运行时的bash脚本能够运行两个python脚本,但是当它由Cron运行时,python脚本不会被执行。 Bash脚本和python脚本位于〜/ CronJobs目录中,它们的输出存储在目录〜/ CronOutput

    以下是一些代码/输出,可能对查找解决方案很有用:

    /etc/cron.d目录中的Cron作业内容和文件权限

    pi@RPI_IronHide:/etc/cron.d $ ls -al AWSScriptCJ
    -rw-r--r-- 1 root root 53 May  1 16:56 AWSScriptCJ
    pi@RPI_IronHide:/etc/cron.d $ cat AWSScriptCJ
    */2 * * * * pi /home/pi/CronJobs/run_awsscrubber.sh
    

    Bash脚本和Python脚本的文件权限

    pi@RPI_IronHide:~/CronJobs $ ls -al
    total 28
    -rw-rw-r--  1 pi pi 2264 May  1 10:41 gmail_run_alert.py
    -rw-rw-r--  1 pi pi 7166 May  1 10:50 imd_aws_parse_rc4.py
    -rwxr-xr-x  1 pi pi 1812 May  1 17:26 run_awsscrubber.sh
    

    CronJobs和CronOutput目录的权限

    pi@RPI_IronHide:~ $ ls -al
    total 148
    drwxr-xr-x  2 pi   pi    4096 May  1 17:27 CronJobs
    drwxr-xr-x  2 pi   pi    4096 May  1 16:55 CronOutput
    

    单次运行日志文件内容

    pi@RPI_IronHide:~/CronOutput $ cat AWS_Data_Scrub_Latest.log
    Tue 1 May 17:56:01 IST 2018
    LANG=en_GB.UTF-8
    PWD=/home/pi
    HOME=/home/pi
    SHELL=/bin/bash
    SHLVL=1
    LOGNAME=pi
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    _=/usr/bin/printenv
    Script Begin!
    Online
    
    Removing geckodriver.log File
    Removing aws_html.html File
    
    Removing Single Run CSV File
    Script End Success!
    

    Cron记录来自/ var / log / syslog

    pi@RPI_IronHide:~ $ grep CRON /var/log/syslog | tail -10
    May  1 17:48:01 RPI_IronHide CRON[2555]: (pi) CMD (/home/pi/CronJobs/RunACronTask.sh)
    May  1 17:48:01 RPI_IronHide CRON[2556]: (pi) CMD (/home/pi/CronJobs/run_awsscrubber.sh)
    May  1 17:50:01 RPI_IronHide CRON[2590]: (pi) CMD (/home/pi/CronJobs/run_awsscrubber.sh)
    May  1 17:50:01 RPI_IronHide CRON[2591]: (pi) CMD (/home/pi/CronJobs/RunACronTask.sh)
    May  1 17:52:01 RPI_IronHide CRON[2625]: (pi) CMD (/home/pi/CronJobs/RunACronTask.sh)
    May  1 17:52:01 RPI_IronHide CRON[2626]: (pi) CMD (/home/pi/CronJobs/run_awsscrubber.sh)
    May  1 17:54:01 RPI_IronHide CRON[2675]: (pi) CMD (/home/pi/CronJobs/run_awsscrubber.sh)
    May  1 17:54:01 RPI_IronHide CRON[2674]: (pi) CMD (/home/pi/CronJobs/RunACronTask.sh)
    May  1 17:56:01 RPI_IronHide CRON[2725]: (pi) CMD (/home/pi/CronJobs/run_awsscrubber.sh)
    May  1 17:56:01 RPI_IronHide CRON[2726]: (pi) CMD (/home/pi/CronJobs/RunACronTask.sh)
    

    Bash脚本内容

    pi@RPI_IronHide:~/CronJobs $ cat run_awsscrubber.sh
    #!/bin/bash
    
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    SHELL=/bin/bash
    MAILTO=""
    
    LOG_FILE_N="/home/pi/CronOutput/AWS_Data_Scrub.log"
    CURR_LOG_FILE="/home/pi/CronOutput/AWS_Data_Scrub_Latest.log"
    
    echo $(/bin/date) >> $LOG_FILE_N
    printenv >> $LOG_FILE_N
    echo $(/bin/date) > $CURR_LOG_FILE
    printenv >>$CURR_LOG_FILE
    
    echo "Script Begin!" >> $LOG_FILE_N
    echo "Script Begin!" >> $CURR_LOG_FILE
    
    /usr/bin/wget -q --tries=10 --timeout=20 --spider XXX.XXX.167.219
    
    if [[ $? -eq 0 ]]; then
        echo "Online" >> $LOG_FILE_N
        echo "Online" >> $CURR_LOG_FILE
        CURRENT_RUN_OP=$(python imd_aws_parse_rc4.py)
        echo $CURRENT_RUN_OP >> $CURR_LOG_FILE
        echo $CURRENT_RUN_OP >> $LOG_FILE_N
        echo "Removing geckodriver.log File" >> $LOG_FILE_N
        echo "Removing geckodriver.log File" >> $CURR_LOG_FILE
        rm /home/pi/CronJob/geckodriver.log
        echo "Removing aws_html.html File" >> $LOG_FILE_N
        echo "Removing aws_html.html File" >> $CURR_LOG_FILE
        rm /home/pi/CronOutput/aws_html.html
        EMAIL_RUN_OP=$(python gmail_run_alert.py)
        echo $EMAIL_RUN_OP >> $CURR_LOG_FILE
        echo $EMAIL_RUN_OP >> $LOG_FILE_N
        echo "Removing Single Run CSV File" >> $LOG_FILE_N
        echo "Removing Single Run CSV File" >> $CURR_LOG_FILE
        rm /home/pi/CronOutput/strip_d_temp.csv
        echo "Script End Success!" >> $CURR_LOG_FILE
        echo "Script End Success!" >> $LOG_FILE_N
        echo -e "\n" >> $LOG_FILE_N
        exit 1
    else
        echo "Offline" >> $LOG_FILE_N
        echo "Offline" >> $CURR_LOG_FILE
        EMAIL_RUN_OP=$(python gmail_run_alert.py)
        echo $EMAIL_RUN_OP >> $CURR_LOG_FILE
        echo $EMAIL_RUN_OP >> $LOG_FILE_N
        echo "Script End Unable to Access Website!" >> $CURR_LOG_FILE
        echo "Script End Unable to Access Website!" >> $LOG_FILE_N
        echo -e "\n" >> $LOG_FILE_N
        exit 0
    fi
    

2 个答案:

答案 0 :(得分:1)

请同时为Python脚本提供执行权限。还要检查您的cron tab帐户是否已添加到具有您的shell脚本所有权的组中。如果不是,则需要将该帐户添加到适当的组。文件权限本身就不够了。还要检查cron tab帐户是否已完全超出目录路径。例如,假设您的目录路径为/home/pi/CronJobs/,则cron tab帐户应具有cd /home/pi/CronJobs/的权限。

答案 1 :(得分:1)

您没有提供python脚本的完整路径。选择其中一个

EMAIL_RUN_OP=$(python /home/pi/CronJobs/gmail_run_alert.py)

cd /home/pi/CronJobs
EMAIL_RUN_OP=$(python gmail_run_alert.py)

cd "$(dirname "$0")"    # the directory of the current script, without hardcoding
EMAIL_RUN_OP=$(python gmail_run_alert.py)