OSX launchctl ZSH Shell Script не ожидает завершения внешней программы - PullRequest
1 голос
/ 02 марта 2020

Я установил speedtest. net CLI и написал простой ZSH сценарий оболочки для запуска двоичного файла speedtest и создания выходных данных CSV.

Хотите запускать этот сценарий каждый [период времени] (первоначально каждый час) и собирать данные о скоростных испытаниях в файл журнала для последующего анализа. Прочитав о cron и launchctl на Ma c, я решил создать собственный агент launchctl plist для моего скрипта и настроить его на запуск скрипта [в назначенный период времени].

Скрипт успешно выполняется при запуске независимо от launchctl; однако, когда lauchctl запускает скрипт, он не ожидает завершения внешнего вызова двоичного файла speedtest и переходит прямо к последнему утверждению echo. Выходной файл имеет время и дату, успешно добавленные, но отсутствует вывод из двоичного файла speedtest.

Я пытался уснуть, подождать и al oop, чтобы проверить идентификатор PID (который, я считаю, находится в переменной $!), Но происходит то же самое. Поэтому очень нужна помощь, чтобы понять, что происходит и как это исправить.

PLIST LaunchAgent

    <?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.dazzur.runspeedtest</string>
    <key>StandardOutPath</key>
        <string>/Users/dazzur/OneDrive/dazDocs/Development/work/speedtestresults/speedtestresults.csv</string>
    <key>ProgramArguments</key>
        <array>
            <string>/Users/dazzur/OneDrive/dazDocs/Development/work/speedtestresults/runspeedtest.sh</string>
        </array>
    <key>RunAtLoad</key>
        <true/>
    <key>ThrottleInterval</key>
        <integer>60</integer>
    <key>KeepAlive</key>
        <true/>
    <key>HardResourceLimits</key>
        <dict>
            <key>FileSize</key>
            <integer>10485760</integer>
        </dict>
    <key>SoftResourceLimits</key>
        <dict>
            <key>FileSize</key>
            <integer>5242880</integer>
        </dict>
</dict>
</plist>

ZSH Shell Script

#!/bin/zsh

dtFormatted=$(date "+%F %T")

csvResults=$(speedtest --format=csv)

while ($!)
    do
        sleep 10
done

echo '"'$dtFormatted'"',$csvResults

К вашему сведению - я нашел этот сайт действительно полезным для понимания работы launchctl - https://www.launchd.info/ и пробной версии инструмента Launch Control, чтобы проверить, что то, что я сделал, работает https://www.soma-zone.com/LaunchControl/.

...