【发布时间】:2018-05-02 00:22:00
【问题描述】:
我的问题解决了: 我为 python 脚本提供了执行权限,在 /etc/ 目录中添加了 cron.allow 文件(带有文件 包含唯一的条目“pi”,不带引号,这是我的用户名) 并提供了 python 脚本的完整路径。我无法 确定哪个解决方案使它起作用,感谢glenn jackman 和 Abhijit Pritam.
我有 两个 python 脚本,它们由 执行一个 bash 脚本。因为我希望这个脚本每隔几个小时运行一次,所以我设置了一个 Cron 作业。 Bash 脚本的 (run_awsscrubber.sh) 作业如下:
- 设置环境。
- 将 Bash 脚本运行时间写入两个日志文件(一个用于所有之前的运行,一个用于此次运行)。
- 使用 wget 检查 IP 地址是否已启动。
- 如果上升:
- 运行脚本 imd_aws_parse_rc4.py 并将其输出捕获到变量中并将其写入日志文件。
- 运行脚本 gmail_run_alert.py 并将其输出捕获到变量中并将其写入日志文件。
- 清理一些生成的文件
- 如果没有启动:
- 运行脚本 gmail_run_alert.py 并将其输出捕获到变量中并将其写入日志文件。
- 清理一些生成的文件
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