cronjob не выполняется при отсутствии входа в систему

\{7\} конструкция является простым случаем \{m,n\} для "соответствия, по крайней мере, m и самое большее n, в Вашем случае это будет:

sed -e 's/\(AAAA[A-Z]\{2\}[0-9]\{7,8\}\)XXXX/\n\1/g'

Возможно, простое:

sed -s 's/XXXX//g'

находится достаточно в Вашем случае?

6
06.11.2014, 16:02
2 ответа

Вы должны поместить свой скрипт в отдельный каталог, который наверняка доступен во время выполнения задания cron, например /usr/local/bin/.

Также хорошей традицией является запись crontab таких записей:

M H * * *  test -x /usr/local/bin/myscript.sh || /usr/local/bin/myscript.sh

, чтобы crontab даже не пытался выполнить скрипт, если он недоступен.


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

6
27.01.2020, 20:28

Файл журнала показывает, что задание crontab было запущено:

Nov  6 09:50:01 python CRON[30936]: (user) CMD (/home/user/scripts_automated/crontab1.sh)

И через мгновение было отправлено электронное сообщение:

Nov  6 09:50:01 python sendmail[30938]: sA68o1a4030938: from=user, size=347, class=0, nrcpts=1, msgid=<201411060850.sA68o1a4030938@python>, relay=user@localhost

Следующая строка в лог-файле почти наверняка была бы дополнительной половиной к этой, показывающей, куда она шла.

В чем актуальность письма? CRON захватывает stdout и stderr при каждом запуске задания. Если какой-либо из них не пуст -, он отправляет сообщение электронной почты на локальную учетную запись электронной почты пользователя, содержащее захваченный текст. В случае userэто будет локальная учетная запись электронной почты user. (Если у вас настроена подсистема электронной почты, она может быть переадресована -за пределы сайта, но давайте предположим, что не сейчас. )Локальная электронная почта обычно записывается в файл /var/mail/$USERили /var/spool/mail/$USER. Это текстовый файл, и новые сообщения просто добавляются, поэтому вы можете использовать more, lessили даже catдля просмотра файла. Последнее сообщение было бы тем, которое вы хотели прочитать.

Глядя на созданный вами сценарий, я подозреваю, что в вашем случае сгенерированное сообщение об ошибке было бы примерно таким:

-sh: /home/user/scripts_automated/crontab1.sh: Permission denied

Если это так, то это потому, что вы пытаетесь запустить crontab1.shкак программу, но не сделали ее исполняемой. Исправьте это с помощью chmod a+x /home/user/scripts_automated/crontab1.sh.

Другие ошибки могут быть связаны с отсутствующими переменными среды, в том числе PATHне установленными, как вы ожидаете. Это связано с тем, что cronимеет очень ограниченную среду и не использует файлы запуска, такие как .bashrc, .profileи т. д. Другая возможность заключается в том, что ваш домашний каталог может быть зашифрован, когда вы не вошли в систему. В этом случае cronне сможет найти сценарий для выполнения, поэтому он может только завершиться ошибкой. Есть много вопросов (и ответов )по https://unix.stackexchange.com/, касающихся подобных проблем, поэтому я не буду их здесь повторять.

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

(Шесть лет спустя это станет ответом для будущих читателей)

0
18.06.2021, 07:56

Теги

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