我有一个永远 运行 的脚本,我怎样才能 运行 它在启动时在 macos 的后台运行?
I have a script that runs forever, how can I run it at startup in the background on macos?
我似乎找不到结合我需要的两件事的答案:启动时和后台。
所以我编写了一个脚本来检查 mac (Catalina) 鼠标和键盘的电池电量百分比。脚本 运行 无限期地每 30 分钟执行一次检查。
目前,我最好的选择是使用自动程序创建一个 .app 文件,该文件 运行 是 python 脚本。然后我把它放在 'login items' 中,它在启动时 运行s,非常好。
唯一的问题是我现在有一个烦人的齿轮,它会在菜单栏中永久旋转。
我读到使用 launchctl 将允许脚本在后台 运行,但显然你不能通过这种方式从启动时 运行。是真的吗?
有谁知道我如何实现这两个要求:在启动时拥有脚本 运行,并且拥有它 运行 而我没有注意到它正在 运行ning?
我使用启动代理来完成类似的工作,我在登录时需要 运行 的工作。
在这种情况下,您应该更改脚本,使其不会永远循环,而是只执行一次并安排此脚本每 30 分钟定期执行一次。
在 ~/Library/LaunchAgents/your-service-name.plist
中创建一个小的 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>your.namespace.goes.here</string>
<key>ProgramArguments</key>
<array>
<string>yourscript-path-goes-here</string>
<string>some-args</string>
</array>
<key>StartInterval</key>
<integer>1800</integer>
</dict>
</plist>
加载启动代理
launchctl load -w <path_to_the_plist_file>
请记住在 plist 文件中设置适当的环境变量,因为它不会从您的 shell 继承环境变量,因为它不在该范围内 运行。
有关启动代理和守护进程的更多信息,请参阅 this link。
我注意到,当launch agent framework调用我的脚本并且脚本快速退出时,fw认为脚本正常工作,所以它一次又一次地重新启动脚本,最后将其标记为不工作。所以我不得不在启动代理调用的脚本中提供 sleep 10
。
您可以使用别名 launchctl print user/$(id -u $(whoami)) | grep <yournamespace>
来显示活动启动代理的列表。
Here 是您可以找到我的启动代理小脚本的地方。
我似乎找不到结合我需要的两件事的答案:启动时和后台。
所以我编写了一个脚本来检查 mac (Catalina) 鼠标和键盘的电池电量百分比。脚本 运行 无限期地每 30 分钟执行一次检查。
目前,我最好的选择是使用自动程序创建一个 .app 文件,该文件 运行 是 python 脚本。然后我把它放在 'login items' 中,它在启动时 运行s,非常好。
唯一的问题是我现在有一个烦人的齿轮,它会在菜单栏中永久旋转。
我读到使用 launchctl 将允许脚本在后台 运行,但显然你不能通过这种方式从启动时 运行。是真的吗?
有谁知道我如何实现这两个要求:在启动时拥有脚本 运行,并且拥有它 运行 而我没有注意到它正在 运行ning?
我使用启动代理来完成类似的工作,我在登录时需要 运行 的工作。
在这种情况下,您应该更改脚本,使其不会永远循环,而是只执行一次并安排此脚本每 30 分钟定期执行一次。
在 ~/Library/LaunchAgents/your-service-name.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>your.namespace.goes.here</string>
<key>ProgramArguments</key>
<array>
<string>yourscript-path-goes-here</string>
<string>some-args</string>
</array>
<key>StartInterval</key>
<integer>1800</integer>
</dict>
</plist>
加载启动代理
launchctl load -w <path_to_the_plist_file>
请记住在 plist 文件中设置适当的环境变量,因为它不会从您的 shell 继承环境变量,因为它不在该范围内 运行。
有关启动代理和守护进程的更多信息,请参阅 this link。
我注意到,当launch agent framework调用我的脚本并且脚本快速退出时,fw认为脚本正常工作,所以它一次又一次地重新启动脚本,最后将其标记为不工作。所以我不得不在启动代理调用的脚本中提供 sleep 10
。
您可以使用别名 launchctl print user/$(id -u $(whoami)) | grep <yournamespace>
来显示活动启动代理的列表。
Here 是您可以找到我的启动代理小脚本的地方。