Попытка использовать launchd, чтобы мой iMac работал 10.7.5, чтобы отправить мне электронное письмо, что его IP-адрес не работает

1

Это первый раз, когда я использую launchd, поэтому я многое не знаю.

Немного справочной информации.

Я настроил все, чтобы иметь возможность использовать команду mail для отправки электронных писем с моим gmail. Написал скрипт bash (IPSend.sh), используя ifconfig, grep и mail. Запуск сценария вручную, так как любой пользователь, включая root, работает отлично и отправляет электронное письмо на указанный адрес электронной почты. Скопировал скрипт в каталог / usr / local / bin / с правами доступа rwxr-xr-x, а скрипт -rwxr-xr-x @ все равно root: wheel. Создал файл plist и скопировал его в / Library / LaunchDaemons (корневое колесо -rw-r - r - @ 1 918 25 декабря 16:01 com.fer.ip.plist), отладил его с помощью plutil -lint, пока результат не был получен ХОРОШО.

Когда я запускаю команду load /Library/LaunchDaemon/com.fer.ip.plist (как root), я не получаю никаких ошибок, электронное письмо не отправляется, и журнал показывает что-то вроде:

25 декабря 16:18:00 dbe4b6a01 com.apple.launchd [1] ("com.fer.ip"): Регулирование респауна: начнется через 6 секунд
25 декабря 16:18:06 dbe4b6a01 com.apple.launchd [1] ("com.fer.ip"): Возобновление регулирования: начнется через 10 секунд
25 декабря 16:18:37: --- последнее сообщение повторено 2 раза --- 25 декабря 16:18:37 dbe4b6a01 com.apple.launchd [1] ("com.fer.ip"): Регулирование респауна: начнется через 10 секунд
25 декабря 16:18:37 dbe4b6a01 com.apple.launchd [1] (0x7f9170659600.anonymous.sendmail [20303]): не удалось add kevent для PID 20303. Выгрузится при возврате MIG
25 декабря 16:18:37 dbe4b6a01 com.apple.launchd [1] (0x7f9170659600.anonymous.sendmail [20303]): выгрузка PID 20303 при возврате MIG.
25 декабря 16:18:47 dbe4b6a01 com.apple.launchd [1] ("com.fer.ip"): Регулирование респауна: начнется через 10 секунд 25 декабря 16:19:00: --- последнее сообщение повторено 1 раз ---
25 декабря 16:19:00 dbe4b6a01 com.apple.launchd [1] ("com.fer.ip"): Регулирование респауна: начнется через 7 секунд

Причина, по которой я говорю «что-то в этом роде», заключается в том, что иногда я не получаю «Не удалось добавить kevent для PID» или он появляется раньше.

Я полностью потерян. Понятия не имею, что означает «Не удалось добавить kevent для PID» или почему он не работает как процесс запуска, когда работает вручную. Пожалуйста помоги!

Вот мой сценарий изменения моего адреса электронной почты:

#!/bin/sh

ifconfig | grep -o -E [0-9]+[.][0-9]+[.][0-9]+[.][0-9]+ |grep -v "127" |grep -v "255" | mail -s "iMac" myemail@isp.com.xx

и вот мой файл plist:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> 

<dict>
        <key>label</key>
        <string>"com.fer.ip"</string>

        <key>ProgramArguments</key>

        <array> 
            <string>/usr/local/bin/IPSend.sh</string>
        </array>

        <key>OnDemand</key>
        <false/>

        <key>StartInterval</key>
        <integer>60</integer>

        <key>KeepAlive</key>
                <true/>

        <key>StandardOutPath</key>
        <string>/tmp/test.stdout</string>

        <key>StandardErrorPath</key>
        <string>/tmp/test.stderr</string>

</dict>
</plist>

И стандартные ошибки, и стандартные файлы вывода всегда пусты

Фероз
источник
Вместо grepтрехкратного трубопровода просто используйте:ifconfig | awk '/broadcast/{print $2}'
user3439894

Ответы:

1

Я не знаю, почему я пропустил это в первый раз, но, рассмотрев вашу проблему только сейчас, я заметил несколько несоответствий в файле plist, которые вполне могут быть проблемой. Я думаю, что это решит вашу проблему.

    <?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>com.fer.ip</string>
                            <key>Program</key>
                                <string>/usr/local/bin/IPSend.sh</string>
                            <key>RunAtLoad</key>
                                <true/>
                            <key>KeepAlive</key>
                                <false/>    
                   </dict> 
</plist>

Надеюсь, что это поможет!

F.

Фрэнсис из ResponseBase
источник
0

Несколько предложений:

  1. В листе поменяй:

    OnDemand to true; KeepAlive to false
  2. Перепроектируйте сценарий оболочки, чтобы сообщить о состоянии на стандартный выход или сбой и сообщить о стандартной ошибке. Нравится:

    #!/bin/bash
    
    MYSTDOUT=/tmp/test.stdout
    
    MYSTDERR=/tmp/test.stderr
    
    [[ ifconfig | grep -o -E [0-9]+[.][0-9]+[.][0-9]+[.][0-9]+ | grep -v "127" | grep -v "255" | mail -s "iMac" myemail@isp.com.xx ]] && [[ echo "(X) SUCCESS: email sent" > ${MYSTDOUT} ; exit [0] ]]
    
    echo "(!) FAILURE: email not sent" 2> ${MYSTDERR} 
    
    exit [1]
    

Надеюсь, что это поможет.

Фрэнсис из ResponseBase
источник
Большое спасибо за ваши предложения. Я посмотрю на это и сообщу вам результаты.
FerOZ