Мой скрипт не запускается по расписанию cron

Вы можете использовать команду unix cut, чтобы выбрать vin в data.csv. Затем используйте sort и uniq -d, чтобы найти общие вин-коды в обоих файлах.

В баш:

cut -d',' -f9 > vin_data
sort vin_data vinlist | uniq -d > vin_to_delete

Затем вы можете использовать Python или ваш любимый язык сценариев для создания нового файла. Мой скрипт на питоне.

f=open('data_vin_removed.csv','w')
v=[i.strip() for i in open('vin_to_delete')]
for i in open('data.csv'):
    if any([j in i for j in v]):
        continue
    else:
        f.write(i)
f.close() 

Это создаст файл со строками data.csv, у которых нет вин в списке вин.

0
06.08.2019, 15:43
2 ответа

crontab запускает сценарии в среде, отличной от оболочки входа в систему; в частности, PATH может быть другим или неопределенным.

Попробуйте использовать абсолютный путь в командах (lynx, head... )Вы можете получить их с помощью

which <command>

Кроме того, вы должны указать путь к файлу test.log.

2
28.01.2020, 02:18

Ваш сценарий работает нормально, но он записывает данные в файл с именем test.logв текущем каталоге. Поскольку вы никогда не используете cdв своем скрипте, текущий каталог технически находится где угодно, но, скорее всего, это домашний каталог пользователя.

Для записи в test.log, расположенный в другом месте, либо cdв правильный каталог в скрипте, либо укажите полный путь к файлу test.logпри перенаправлении на него.

Также обратите внимание на то, что вы выполняете бесполезно много перенаправлений к выходному файлу. Если все выходные данные вашего оператора ifдолжны быть добавлены в файл журнала, вы также можете сделать

if...; then
  ...
elif...; then
  ...
else
  ...
if >>/path/to/test.log

, который будет перенаправлять весь вывод оператора ifв файл.

Или, если все выходные данные сценария должны быть перенаправлены в файл журнала, вы также можете перенаправить из crontab с помощью

0 * * * * bash /usr/local/bin/test.sh >>/path/to/test.log

(некоторые crontabs поддерживают @hourlyкак ярлык для записи 0 * * * *, кстати, проверьте man 5 crontabв вашей системе ).

Тег 2>&1после перенаправления стандартного вывода в файл, чтобы также перенаправить стандартный поток ошибок (, то есть... >/path/to/test.log 2>&1).

Кроме того, у вас есть /bin/shв строке сценария #!, но вы запускаете сценарий с bashявно из crontab. Это смущает. Насколько я вижу, в вашем сценарии нетbash-ничего особенного, поэтому либо запустите его с помощью /bin/shиз crontab, либо просто сделайте его исполняемым и не указывайте интерпретатор в командной строке. в crontab, чтобы запустить его.


Мой взгляд на ваш сценарий:

#!/bin/sh

now=$(date "+%d-%m-%Y - %H:%M")
logfile=/usr/local/bin/test.log

status=$( lynx -head -source 'https://example.com' | awk 'FNR == 1 { print $2 }' )

case $status in
    503)
        systemctl restart mydaemon
        message='Daemon restarted, site was unavailable'
        ;;
    200)
        message='Site is available'
        ;;
    *)
        message='Site status is unknown'
esac

printf '%s: %s (status=%s)\n' "$now" "$message" "$status" >>"$logfile"
2
28.01.2020, 02:18

Теги

Похожие вопросы