【问题标题】:Python Script Not Executing When Run By a Bash Script Called Periodically by Cron由 Cron 定期调用的 Bash 脚本运行时 Python 脚本不执行
【发布时间】:2018-05-02 00:22:00
【问题描述】:

我的问题解决了: 我为 python 脚本提供了执行权限,在 /etc/ 目录中添加了 cron.allow 文件(带有文件 包含唯一的条目“pi”,不带引号,这是我的用户名) 并提供了 python 脚本的完整路径。我无法 确定哪个解决方案使它起作用,感谢glenn jackmanAbhijit 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. 清理一些生成的文件

imd_aws_parse_rc4.py:此脚本中的代码使用 Selenium WebDriver、Firefox、Gecko 驱动程序和 Beautiful Soup 清理网站以获取信息,并将解析后的数据以 CSV 格式存储在文件中。

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

我使用的是运行 Raspbian Stretch 的 Raspberry Pi 3。

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!

来自 /var/log/syslog 的 Cron 日志

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

【问题讨论】:

标签: python linux bash shell cron


【解决方案1】:

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

【讨论】:

【解决方案2】:

您没有提供 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)

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 2020-12-11
    • 2013-02-26
    • 2013-09-25
    • 2013-11-26
    • 1970-01-01
    • 2018-09-13
    • 2015-03-16
    相关资源
    最近更新 更多