Добрый день, коллеги.
Сделал скрипт, который при старте и остановке системы посылает письмо мне.
Поместил его в init.d, сделал симлинки по науке для 3 и 5 уровня: S50message, K01message (при запуске последним, при остановке - первым).
Но вот незадача! Остановка происходит, видимо, очень быстро и параллельно, что сообщение-то он отправляет, но MTA его отправляет только в следующий раз после включения.
Как бы так сделать, чтобы MTA (postfix) не завершался, пока мой скрипт не отработает?
Даже в зависимостях я там поставил postfix (Required-Stop: postfix) - не помогает.
Если из консоли (ssh) делать init 0 - тогда отправляется правильно.
Но если из иксов делать завершение - нет.
Что я сделал не так?
> Как бы так сделать, чтобы MTA (postfix) не завершался, пока мой скрипт
> не отработает?Правильный вопрос будет такой: «Как бы так сделать, чтобы MTA (postfix) не завершался, пока не отправит моё письмо?»
Скрипт должен убедиться, что письмо действительно отправлено, прежде чем завершиться. Иначе никто не гарантирует, что Постфикс успеет его оправить в этой жизни.
Самое простое, что приходит в голову, — последить за очередью на отправку или логами Постфикса.
В скрипте у меня даже пауза есть, секунды 2-3. Это не меняет дела.
Как скрипт может влиять на init?? Фиолетово - убедился скрипт в отправке или нет, постфикс выключен и рабочая станция пошла в halt.
Тут надо как-то сказать init чтобы не завершал postfix (и всё, что для него требуется) до того, как выйдет скрипт.
> В скрипте у меня даже пауза есть, секунды 2-3. Это не меняет
> дела.
> Как скрипт может влиять на init?? Фиолетово - убедился скрипт в отправке
> или нет, постфикс выключен и рабочая станция пошла в halt.
> Тут надо как-то сказать init чтобы не завершал postfix (и всё, что
> для него требуется) до того, как выйдет скрипт.Зачем вам вообще в этой ситуации постфикс? Отправляйте прямо из тела скрипта.
К тому же, если вы станете ждать пока постфикс не отправит письмо, а письмо попадет в отложенную очередь (сразу не отправится), ребут может так никогда и не закончиться.
> Зачем вам вообще в этой ситуации постфикс? Отправляйте прямо из тела скрипта.Полагаю, вы хотите предложить отправлять на сторонний смтп-релей?
Я думал про это. Но оно неудобно по ряду причин.
>> Зачем вам вообще в этой ситуации постфикс? Отправляйте прямо из тела скрипта.
> Полагаю, вы хотите предложить отправлять на сторонний смтп-релей?
> Я думал про это. Но оно неудобно по ряду причин.Гхм... зачем вам смтп-релей чтобы отправить письмо? Это элементарно делается прямо из скрипта. Либо прогой из шелл либо перл-скриптом.
https://www.yandex.ru/yandsearch?clid=9582&text=отправка%20письма%20из%20bash&l10n=ru&lr=20728&redircnt=1470127601.1
https://www.yandex.ru/search/?clid=9582&text=sendEmail%...
https://www.yandex.ru/search/?text=отправка%20письма%20perl&lr=20728&clid=9582
>>> Зачем вам вообще в этой ситуации постфикс? Отправляйте прямо из тела скрипта.
>> Полагаю, вы хотите предложить отправлять на сторонний смтп-релей?
>> Я думал про это. Но оно неудобно по ряду причин.
> Гхм... зачем вам смтп-релей чтобы отправить письмо? Это элементарно делается прямо
> из скрипта. Либо прогой из шелл либо перл-скриптом.
> https://www.yandex.ru/yandsearch?clid=9582&text=отправка%20письма%20из%20bash&l10n=ru&lr=20728&redircnt=1470127601.1
> https://www.yandex.ru/search/?clid=9582&text=sendEmail%...
> https://www.yandex.ru/search/?text=отправка%20письма%20perl&lr=20728&clid=9582То что вы предлагаете - не что иное, как "отправка письма по смтп, как любой смтп клиент".
1. Зареги адрес в мэйлру или гмыле.
2. Включи там возможность отправить через смтп.
3. Узнай адрес смтп, порт, открой порты, установи емейл-клиента (как вы предлагаете sendEmail), OpenSSL и пр.
4. Еще потом трахайся с авторизацией полдня, следи, почему не отправляется и тп.В таком случае лучше поднять во вне свой релей и прописать там нужные ИП, обратные зоные и тп.
Но и этим я не хочу заниматься, т.к. все равно "есть зависимость от стороннего сервиса".
"Прямо из скрипта", как вы говорите, я и отправляю:
echo "Some message@|/bin/mail -s subject some@address.com
Можно команде mail сказать, чтоб отправляла на тот самый релей. Но мне это неудобно.
Надо чтобы отправлялось сразу на сервер получателя по MX, однако mail этого делать не умеет.
Задача-то простая. Всего навсего притормозить секунды на 3 останов постфикса и сети.
>[оверквотинг удален]
>> Гхм... зачем вам смтп-релей чтобы отправить письмо? Это элементарно делается прямо
>> из скрипта. Либо прогой из шелл либо перл-скриптом.
>> https://www.yandex.ru/yandsearch?clid=9582&text=отправка%20письма%20из%20bash&l10n=ru&lr=20728&redircnt=1470127601.1
>> https://www.yandex.ru/search/?clid=9582&text=sendEmail%...
>> https://www.yandex.ru/search/?text=отправка%20письма%20perl&lr=20728&clid=9582
>То что вы предлагаете - не что иное, как "отправка письма по смтп, как любой смтп клиент".
>1. Зареги адрес в мэйлру или гмыле.
>2. Включи там возможность отправить через смтп.
>3. Узнай адрес смтп, порт, открой порты, установи емейл-клиента (как вы предлагаете sendEmail), OpenSSL и пр.
>4. Еще потом трахайся с авторизацией полдня, следи, почему не отправляется и тп.Зачем вы все это делаете? Ссылки которые я вам дал- как раз отправляют письмо сразу на почтовый сервер получателя.
> Надо чтобы отправлялось сразу на сервер получателя по MX, однако mail этого
> делать не умеет.У меня перловый скрипт, отправляет "сразу на сервер получателя по MX". 10 строк кода. Ссылки я вам дал.
>Задача-то простая. Всего навсего притормозить секунды на 3 останов постфикса и сети.
https://www.yandex.ru/search/?text=service%20linux%20зависимость%20сервисов&lr=20728&clid=9582
> Зачем вы все это делаете? Ссылки которые я вам дал- как раз
> отправляют письмо сразу на почтовый сервер получателя.1. Допустим, я напишу в скрипте отправку по смтп с помощью телнета напрямую по MX (в общем то же самое, что "ваш перловый скрипт"). Но init0-то идет, и его никто не останавливал!! причем одновременно и параллельно!! Вы это понимаете? Это значит, что в этот момент параллельно идет завершение не только постфикса, но и сети и прочих вещей, которые нужны для отработки такого скрипта.
2. Зависимость сервисов прописана. См. первый пост. Это не помогает.
>> Зачем вы все это делаете? Ссылки которые я вам дал- как раз
>> отправляют письмо сразу на почтовый сервер получателя.
> 1. Допустим, я напишу в скрипте отправку по смтп с помощью телнета
> напрямую по MX (в общем то же самое, что "ваш перловый
> скрипт"). Но init0-то идет, и его никто не останавливал!! причем одновременно
> и параллельно!! Вы это понимаете? Это значит, что в этот момент
> параллельно идет завершение не только постфикса, но и сети и прочих
> вещей, которые нужны для отработки такого скрипта.Вот про сеть это правильная мысль. а про постфикс-нет. ведь он же не участвует в этом процессе.
> 2. Зависимость сервисов прописана. См. первый пост. Это не помогает.
>Даже в зависимостях я там поставил postfix (Required-Stop: postfix)То есть message должен подождать пока postfix не завершится? Наверное он так и делает.
Ждет пока постфикс не завершится, потом начинает отправлять через постфикс письмо...
Нужно в скриптах сеть, постфикс - поставить зависимость от message наверное...
и в скрипте сеть - поставить зависимость от постфикс...Но постфикс завершается вне зависимости от того есть у него письма на оправку или нет.
И и тут мы возвращаемся к отправке письма без постфикса, а скриптом напрямую из message.
В этом случае нужно проконтролировать только сеть -> "в скрипте сеть - поставить зависимость от message"
>[оверквотинг удален]
> так и делает.
> Ждет пока постфикс не завершится, потом начинает отправлять через постфикс письмо...
> Нужно в скриптах сеть, постфикс - поставить зависимость от message наверное...
> и в скрипте сеть - поставить зависимость от постфикс...
> Но постфикс завершается вне зависимости от того есть у него письма на
> оправку или нет.
> И и тут мы возвращаемся к отправке письма без постфикса, а скриптом
> напрямую из message.
> В этом случае нужно проконтролировать только сеть -> "в скрипте сеть -
> поставить зависимость от message"Хотя конечно, можно в скрипт message, в конце, поставить sleep 60 или sleep 600 и надеяться, что постфиксу хватит этого времени чтоб отправить почту.
> Хотя конечно, можно в скрипт message, в конце, поставить sleep 60 или
> sleep 600 и надеяться, что постфиксу хватит этого времени чтоб отправить
> почту.Да не помогает sleep. У меня есть он в конце скрипта (sleep 5).
Пока этот скрипт работает (в фоне), в это время и постфикс и сеть уже завершаются, никого не спрашивая.
>> Хотя конечно, можно в скрипт message, в конце, поставить sleep 60 или
>> sleep 600 и надеяться, что постфиксу хватит этого времени чтоб отправить
>> почту.
> Да не помогает sleep. У меня есть он в конце скрипта (sleep
> 5).
> Пока этот скрипт работает (в фоне), в это время и постфикс и
> сеть уже завершаются, никого не спрашивая.Это имеет смысл делать после того как настроена зависимость сервисов.
Написал телнет-сессию напрямую на MX из баш-скрипта.
Вообще теперь не отправляет (в течение init 0), т.к. сессия смтп длится намного дольше (пауза при helo, пауза при data, rcpt to, итп).
Если скрипт запустить руками - конечно всё отправляется красиво.В общем вопрос остается открытым.
> Написал телнет-сессию напрямую на MX из баш-скрипта.
> Вообще теперь не отправляет (в течение init 0), т.к. сессия смтп длится
> намного дольше (пауза при helo, пауза при data, rcpt to, итп).
> Если скрипт запустить руками - конечно всё отправляется красиво.
> В общем вопрос остается открытым.
> Сделал скрипт, который при старте и остановке системы посылает письмо мне.
> Поместил его в init.d, сделал симлинки по науке для 3 и 5
> уровня: S50message, K01message (при запуске последним, при остановке - первым).А для уровней 0 и 6 сделали? Какая у вас вообще система инициализации используется? Да и дистрибутив неплохо бы знать…
>> Сделал скрипт, который при старте и остановке системы посылает письмо мне.
>> Поместил его в init.d, сделал симлинки по науке для 3 и 5
>> уровня: S50message, K01message (при запуске последним, при остановке - первым).
> А для уровней 0 и 6 сделали? Какая у вас вообще система
> инициализации используется? Да и дистрибутив неплохо бы знать…Для уровня 6 не нужно, а для 0 - там тоже криво: скрипт вызывается с параметром start.
И так же не срабатывает.Дистрибутив - OpenSuse 11.04
Система sysV.
> Для уровня 6 не нужно, а для 0 - там тоже криво:
> скрипт вызывается с параметром start.
> И так же не срабатывает.
> Дистрибутив - OpenSuse 11.04
> Система sysV.Интересно. Я, конечно, дебианщик, с openSUSE дел не имел. Правильно ли я понял, что у вас есть ссылка /etc/rc0.d/K01message, и при выключении (т. е. переходе на уровень 0) системы скрипт по этой ссылке почему-то запускается с аргументом start?
И почему для уровня 6 не нужно? У вас никогда не бывает перезагрузки?
>[оверквотинг удален]
>> скрипт вызывается с параметром start.
>> И так же не срабатывает.
>> Дистрибутив - OpenSuse 11.04
>> Система sysV.
> Интересно. Я, конечно, дебианщик, с openSUSE дел не имел. Правильно ли я
> понял, что у вас есть ссылка /etc/rc0.d/K01message, и при выключении (т.
> е. переходе на уровень 0) системы скрипт по этой ссылке почему-то
> запускается с аргументом start?
> И почему для уровня 6 не нужно? У вас никогда не бывает
> перезагрузки?Ага, понял, в Сусе сделано не так, как в Дебиане. rc0.d и rc6.d здесь, похоже, не нужны.
Еще нюанс.
Компьютер берет сеть по вайфай посредством NetworkManager в иксах.
В итоге, когда комп выключается, (я притормозил постфикс в его init скрипте), видимо сеть отключается быстрее всего, и постфикс ругается на то, что не может найти домен получателя.
Досылает письмо при следующем включении компа.
В общем кривовато.
> Еще нюанс.
> Компьютер берет сеть по вайфай посредством NetworkManager в иксах.
> В итоге, когда комп выключается, (я притормозил постфикс в его init скрипте),
> видимо сеть отключается быстрее всего, и постфикс ругается на то, что
> не может найти домен получателя.
> Досылает письмо при следующем включении компа.
> В общем кривовато.Может проще будет просто мониторить каким-нить nagios какой-нить сервис вашего компа? А там по событиям писать письма, смс-сить, кормить кота?
> Поместил его в init.d, сделал симлинки по науке для 3 и 5
> уровня: S50message, K01message (при запуске последним, при остановке - первым).
> ...
> он отправляет, но MTA его отправляет только в следующий раз после
> включения.sysvinit:
Если lock-файл в /var/lock/subsys не существует, разрешён старт сервиса.
Если lock-файл в /var/lock/subsys существует, разрешён стоп сервиса.
lock-файл: пустой файл с именем сервиса.Можно также заглянуть в /etc/init.d/functions