解决了我的问题:我为python脚本提供了执行权限,在/ etc /目录中添加了cron.allow文件(带有文件) 包含唯一的条目“pi”,没有引号,这是我的用户名) 并提供了python脚本的完整路径。我无能为力 确定哪个解决方案有效,所以感谢glenn jackman和 Abhijit Pritam
我有两个python脚本,由 bash脚本执行。由于我希望每隔几个小时运行一次此脚本,因此我设置了一个Cron作业。 Bash脚本的( run_awsscrubber.sh )作业如下:
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
答案 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)