Используйте системные таймеры для запуска утилиты в разное время каждый день и передачи аргументов.

Постфикс

использует procmailдля доставки электронной почты, а поскольку postfixвызывает procmail, работающий как nobodyиз соображений безопасности, электронные письма, отправленные на root, в конечном итоге будут отправлены пользователю nobody.

Списки рассылки Debian объясняют это лучше, чем я , и предлагают обходной путь:

postfix's own delivery agent can deliver to root's mailbox, but postfix will NEVER fork an external program (e.g. procmail) as root. it either changes UID to the owner of the mail being delivered or if that user is root, then it changes UID to nobody.

so procmail gets run as nobody when delivering root's mail.

i work around this by just symlinking /var/spool/mail/root to /var/spool/mail/nobody - then i can read root's mail as root.
note that this is NOT the recommended way of doing it - most people will recommend that you direct root's mail to another user in /etc/aliases.

Далее в треде они также помнятpostfixFAQ по корневой почте:

If you use procmail (or some other command) for local mail delivery, Postfix will not deliver mail as root. Instead, Postfix runs procmail (or whatever) as nobody. Perhaps some day Wietse will trust Postfix enough to run external commands as root. Solution: just like you're not supposed to log in as root (except for unusual conditions), you're not supposed to receive mail as root.

Create a mail alias for root that forwards mail to a real user.

2
25.08.2019, 17:40
2 ответа

Думаю, что для этих разовых, неповторяющихся -задач я нашел лучшее решение с помощью systemd-run. Для первой записи в списке я бы написал скрипт для запускаsystemd-run --user --on-calendar="2019-08-25 19:51" /usr/local/bin/mlrpt "17:51-18:05" -t 14

1
27.01.2020, 22:08

Другой подход заключается в объединении нескольких элементов в один служебный файл (без таймера ). Элементы:

  • «самостоятельный -перезапуск» Type=oneshotслужбы с директивой EnvironmentFile=/path/to/mlrpt-textfile, которая считывает ваши параметры mlrpt для одного спутникового прохода, закодированные как настроенные varenvs из «текстового файла mlrpt -». Этими параметрами будут 1 )$START _TIME и 2 )$END _TIME для прохождения спутника, 3 )$DURATION прохода и 4 )$WAIT time до следующего прохода.

  • два текстовых файла. Один назывался, скажем, «список mlrpt -» с полным списком настраиваемых параметров mlrpt, похожим, но не идентичным вашему списку с 22 записями. Другой текстовый файл будет содержать только одну запись (, это «текстовый файл mlrpt -», упомянутый выше )

  • .
  • механизм (, включающий простой сценарий ), который считывает первую запись из начала списка «mlrpt -», копирует ее в «текстовый файл mlrpt -», затем удаляет первую запись в "mlrpt -list" и повторяет тот же процесс по запросу -до тех пор, пока не останется ни одной записи в "mlrpt -list" (примечание :копировать в "mlrpt -textfile" не следует добавить, но перезаписать ).

Теперь файл службы oneshot -должен выглядеть примерно так, как показано ниже, чтобы объединить все три элемента в одно рабочее решение. Основной причиной использования oneshot является его способность вмещать не только одну, но и несколько ExecStart=директив. По замыслу директивы ExecStartвыполняются одна за другой. Это позволяет нам создать и запустить упомянутый выше «механизм» с помощью одного единственного сервисного модуля.

# /etc/systemd/system/myservice.service

[Unit]
Description=my service Service
ConditionPathExists=/path/to/mlrpt-textfile # contains $START_TIME, $END_TIME, $WAIT,     
                                            # and $DURATION for a single pass
ConditionFileNotEmpty=/path/to/mlrpt-textfile
EnvironmentFile=/path/to/mlrpt-textfile

[Service]
Type=oneshot
ExecStart=/usr/local/bin/mlrpt $START_TIME-$END_TIME -t $DURATION
ExecStart=/bin/sleep $WAIT
ExecStart=/path/to/script # script copies one entry from mlrpt-list to mlrpt-textfile
ExecStopPost=/bin/systemctl restart myservice.service

[Install]

Конечно, это требует дополнительной обработки, (например. зависимости должны быть добавлены по мере необходимости ). Сценарий также следует использовать для сбоя службы после последнего прохода, например, путем стирания записи в «текстовом файле mlrpt -» после последнего прохода (, чтобы ConditionFileNotEmptyне работал при перезапуске ).

1
27.01.2020, 22:08

Теги

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