отправка электронной почты и уведомление-отправка не работают в crontab - PullRequest
0 голосов
/ 11 февраля 2019

Я настроил crontab для отправки электронной почты и отображения уведомлений на рабочем столе.здесь после следующего скрипта:

#!/bin/sh

ls /home/anis > /tmp/log.log
echo "---------------------$1-------------------" >> /tmp/log.log


info_and_email()
{
    logtime=`date "+%Y/%m/%d %H:%M:%S"`
    notify-send "$1"
    echo "To:myemail@domain.com" > /tmp/report.txt
    echo "From:anysrc@domain.com" >> /tmp/report.txt
    echo "Subject: ------$1----- ($logtime)"  >> /tmp/report.txt
    ssmtp myemail@domain.com < /tmp/report.txt
}

info_and_email "$1"

Если я запускаю скрипт из CLI, скрипт выполняется успешно, отображается уведомление и отправляется электронное письмо, но если скрипт выполняется из crontab, я могусм. скрипт запускается с ps, но электронное письмо не отправляется и уведомление не отображается.

Что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Ваш первый шаг должен быть проверить вашу электронную почту .Если какая-либо из команд вашего скрипта напечатает что-либо, особенно ошибки, cron отправит по электронной почте весь этот вывод владельцу crontab.(При необходимости вы можете перенаправить эту почту пользователю xyz, добавив MAILTO=xyz в свой crontab.)

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

#!/bin/bash -x

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

Наконец, обратите внимание, что все задания cron выполняются в ограниченной среде.man 5 crontab чтобы увидеть, какие переменные среды установлены для каких значений, и предположить, что ничего больше не задано, точка.(Это играет критическую роль по крайней мере в одной из используемых вами утилит.)

Теперь для определенных утилит:


notify-send использует D-Шина Система обмена сообщениями для отправки уведомлений на ваш рабочий стол.Для этого требуется, чтобы он знал, как подключиться к шине D-Bus, например, bus , и это делается с помощью определенной переменной среды:

$ env | grep DBUS
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

Конечно, эта переменная несуществует в стандартной среде cron, поэтому запустите приведенную выше команду в своей системе, а затем скопируйте эту строку DBUS_SESSION_BUS_ADDRESS=... в свой crontab.Это добавляет правильную настройку DBUS_SESSION_BUS_ADDRESS ко всем окружениям ваших заданий cron.


У меня нет опыта работы с ssmtp, но на странице man сказано, что она многословна (-v) режим, поэтому назовите его как:

ssmtp -v myemail@domain.com < /tmp/report.txt

в вашем скрипте и посмотрите, что он вам скажет.

0 голосов
/ 12 февраля 2019

При запуске в режиме cron среда не настроена.Даже не PATH.Поэтому он, вероятно, не находит notify-send или ssmtp.

Либо добавьте PATH в начале вашего скрипта, либо дайте полные имена путей для команд, которые вы вводите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...