Назад | Перейти на главную страницу

Что мешает мне передать по конвейеру файл 600 в почту с помощью launchd?

В OSX 10.6 я запускаю logcheck.sh через. launchd с использованием этого списка

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>org.logcheck</string>
<key>Program</key><string>/opt/local/bin/logcheck.sh</string>
<key>StartInterval</key><integer>600</integer>
</dict>
</plist>

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

cat $TMPDIR/checkreport.$$ | $MAIL -s "$HOSTNAME $DATE system check" $SYSADMIN

где

$TMPDIR=/opt/local/var/tmp
$MAIL=/usr/bin/mail
$SYSADMIN=myuser

однако, если я взломаю его и изменю команду на:

cat $TMPDIR/checkreport.$$ > /Users/myuser/report
cat /Users/myuser/report | $MAIL -s "$HOSTNAME $DATE system check" $SYSADMIN

затем я получаю почту.

Проверка разрешения на tmp с помощью $ls -l /opt/local/var я получил

drwx------  20 root  admin  680 Jul 12 13:29 tmp/

Если я сбегу sudo /opt/local/bin/logcheck.sh первая команда работает.

Если я использую /opt/local/bin/logcheck.sh в crontab root работает первая команда.

Если я добавлю сценарий echo "$(whoami)" > /Users/myuser/launchduser Я вижу, что он действительно запускается с правами root.

Почему я не получаю почту с первой командой в launchd? Это проблема с правами доступа к каналу для отправки по почте?

Ваш ls вывод ясно показывает, что ваш пользователь не может войти ни прочитать в $ TMPDIR, поэтому он не может прочитать файл, даже если он будет ему доступен для чтения.

Как уже указывалось, ваш второй взлом просто создает пустой файл, даже если он не может войти во временный каталог ... поэтому почта приходит, но пуста.

Вам следует:

  • добавьте своего пользователя в группу админки
  • сделать $ TMPDIR g + rXs

чтобы файл был доступен пользователю.

Из любопытства, когда ваш скрипт успешно отправляет отчеты, тела пустые?

Я просто спрашиваю, потому что ваш обходной путь всегда будет генерировать электронное письмо, если / Users / myuser / report доступен для записи, даже если вы не можете прочитать $ TMPDIR / checkreport. $$. Тело будет пустым, но вы получите письмо с соответствующей темой.

Что происходит, когда вы запускаете что-то подобное?

if [ -r $TMPDIR/checkreport.$$ ]; then
    <$TMPDIR/checkreport.$$ $MAIL -s "$HOSTNAME $DATE system check" $SYSADMIN
else
    echo "Unable to read file: $TMPDIR/checkreport.$$" | $MAIL -s "ERROR: $HOSTNAME $DATE system check" $SYSADMIN
fi

Это будет пытаться отправить электронное письмо с отчетом только в том случае, если $ TMPDIR / checkreport. $$ существует и доступен для чтения, в противном случае вы должны получить электронное письмо с явным указанием имени файла, которое он не может прочитать, и вы можете исследовать оттуда.

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

Недавно я сам работал над этим и нашел записи в системном журнале (/var/log/system.log), которые показывают ошибки, связанные с этой проблемой, например:

Nov  1 08:52:14 my-computer com.apple.launchd[1] (org.postfix.master[22591]): Stray process with PGID equal to this dead job: PID 22592 PPID 1 pickup
Nov  1 08:52:14 my-computer com.apple.launchd[1] (org.postfix.master[22591]): Stray process with PGID equal to this dead job: PID 22594 PPID 1 cleanup

Я обнаружил, что мой сценарий logcheck и ожидаемое электронное письмо отлично работали при запуске из командной строки, и что сценарий logcheck хорошо выполнял свои функции при запуске с использованием launchd через сценарий LaunchDaemon.

Однако почта так и не пришла при использовании launchd. Вышеупомянутые и многие другие ошибки, связанные с postfix и sendmail, указывают на то, что дочерние процессы sendmail были завершены с помощью launchd (как часть его процедур сборки мусора?) До того, как они успели завершиться.

Я добавил в свой список следующий ключ:

<key>AbandonProcessGroup</key>
</true>

и почта начала течь при использовании launchd. К сожалению, я все еще получаю сообщения о случайных процессах / мертвых задачах в моем system.log, над устранением которых я сейчас работаю. Я добавил sleep 120 линия к моему logcheck.sh скрипт, который уменьшил, но не устранил эти сообщения. Я мог бы продлить время команды сна в logcheck.sh, чтобы сценарий сохранялся дольше, но мне не нравится этот конкретный «взлом», и я хочу найти более элегантное решение. Я считаю, что launchd не начинает сборку мусора до завершения процесса logcheck.sh ....

Я собираюсь попробовать явно удлинить ключ TimeOut в контрольном списке и посмотреть, работает ли это лучше.