Что мешает мне отправлять из файла '600' в почту в launchd?

В OSX 10.6 я запускаю logcheck.sh через. запустил, используя этот список

<?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? Это проблема с разрешениями для канала на почту?

3 ответа

Решение

Я недавно работал над этим сам, и нашел записи в системном журнале (/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 в контрольном списке и посмотрим, будет ли это работать лучше.

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

Я просто спрашиваю, потому что ваш обходной путь всегда будет генерировать электронное письмо, если /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.

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

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

Вы должны:

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

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

Другие вопросы по тегам