1

我已经安装了 speedtest.net CLI 并编写了一个简单的 ZSH shell 脚本来运行 speedtest 二进制文件并生成 CSV 输出。

希望每隔 [时间段](最初是每小时)运行一次此脚本,并将速度测试数据收集到日志文件中以供以后分析。在阅读了 Mac 上的 cron 与 launchctl 之后,我决定为我的脚本创建一个原生的 launchctl plist 代理,并将其设置为 [在指定时间段] 运行脚本。

该脚本在独立于launchctl运行时运行成功;但是,当 lauchctl 运行脚本时,它不会等待对 speedtest 二进制文件的外部调用完成,而是直接跳转到最终的 echo 语句。输出文件成功附加了时间和日期,但缺少 speedtest 二进制文件的输出。

我尝试过睡眠、等待和循环来检查 PID ID(我相信在 $! 变量中找到),但同样的事情发生了。所以真的需要一些帮助来了解正在发生的事情以及如何解决它。

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 脚本

#!/bin/zsh

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

csvResults=$(speedtest --format=csv)

while ($!)
    do
        sleep 10
done

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

仅供参考 - 我发现这个网站对了解 launchctl 的工作方式非常有帮助 - https://www.launchd.info/和启动控制工具的试用版,以检查我所做的工作是否正常https://www.soma-zone .com/LaunchControl/

4

0 回答 0