Скрипт Python не выполняется при запуске скриптом Bash, периодически вызываемым Cron - PullRequest
0 голосов
/ 01 мая 2018

Моя проблема решена: Я предоставил разрешение на выполнение скриптов Python, добавил файл cron.allow в каталог / etc / (вместе с файлом содержащий единственную запись "пи", без кавычек, который является моим именем пользователя) и предоставил полный путь к скрипту Python. Я не могу определить, какое решение заставило его работать, поэтому благодаря glenn Джекман и Abhijit Pritam .

У меня есть два сценария Python , которые выполняются a bash script . Поскольку я хочу, чтобы этот скрипт запускался каждые несколько часов, я настроил Cron Job . Работа сценария 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 (если он существует) и текущий сгенерированный журнал ошибок по электронной почте на идентификатор.

Я использую Raspberry Pi 3 под управлением Raspbian Stretch.

Скрипт bash при запуске вручную может запускать оба скрипта python, но когда он запускается Cron, скрипты python не выполняются. Сценарии Bash и Python находятся в каталоге ~ / CronJobs, а их выходные данные хранятся в каталоге ~ / CronOutput

Ниже приведен код / ​​вывод, который может быть полезен для поиска решения:

Содержимое задания Cron в каталоге /etc/cron.d и Разрешения для файлов

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 Script и Python Scripts

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 Logs из / 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 голосов
/ 01 мая 2018

Вы не указываете полный путь к скрипту 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)
0 голосов
/ 01 мая 2018

Пожалуйста, предоставьте разрешение на выполнение скрипта Python. Также проверьте, была ли ваша учетная запись cron tab добавлена ​​в группу, которая владеет вашим сценарием оболочки, или нет. Если нет, вам нужно добавить эту учетную запись в соответствующую группу. Разрешение файла само по себе не достаточно. Также проверьте, имеет ли учетная запись cron tab полное превышение пути к каталогу или нет. Например, предположим, что ваш путь к каталогу /home/pi/CronJobs/, теперь cron tab учетная запись должна иметь разрешение на cd /home/pi/CronJobs/.

...