LaunchAgent plist 保持应用程序运行并隐藏

LaunchAgent 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>my.script.keeprunning</string>
    <key>KeepAlive</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
       <string>/path/to/file</string>
    </array>
</dict>
</plist>

即使应用程序崩溃也能运行,但系统重启后焦点会切换到该特定应用程序。我该如何改进脚本以隐藏或最小化运行应用程序?为它编写 applescript 并将其作为服务运行会更容易吗?

谢谢你的建议 ;)

答案1

我有一个解决类似问题的脚本,这里是一个已经在几个不同的应用程序上测试过的修改版本。

on idle
    tell application "System Events"
        set pName to the name of every process
        if pName does not contain "MY APPLICATION" then
            do shell script "open -g /Applications/MY APPLICATION.app"
                                        -- or wherever your application is
        else if pName contains "MY APPLICATION" then
            set makeFalse to visible of window 1 of application "MY APPLICATION"
            if makeFalse is true then set visible of window 1 of application "MY APPLICATION" to false
        end if
    end tell
end idle

请注意,此脚本应保存为“保持打开”应用程序,并可添加到启动项列表中,以便在您重新启动系统时自动加载。

一旦运行,脚本将执行以下操作:

  • 检查正在运行的进程以查看您的应用程序是否已打开。
  • 如果您的应用不在列表中,它将使用命令在后台打开它do shell script "open -g
  • 如果应用程序已打开,它将隐藏主窗口。
  • 处理程序on idle将每 30 秒自动检查一次。如果您想要更长的延迟,您可以添加return,然后输入您希望脚本在再次检查之前等待的秒数(例如return 300五分钟)。这应该在之前添加end idle

我用此信息隐藏应用程序的 Dock 图标并让其完全在后台运行。

答案2

例如将此 plist 保存为~/Library/LaunchAgents/some.label.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>some.label</string>
  <key>ProgramArguments</key>
  <array>
    <string>lsappinfo</string>
    <string>launch</string>
    <string>launchandhide=true</string>
    <string>nofront=true</string>
    <string>/Applications/Mail.app</string>
  </array>
  <key>StartInterval</key>
  <integer>60</integer> <!-- run the program every 60 seconds -->
</dict>
</plist>

然后运行launchctl load ~/Library/LaunchAgents/some.label.plist

您也可以使用open -jga Mailpgrep -qx Mail||open -jga Mail代替lsappinfo launch launchandhide=true nofront=true /Applications/Mail.appopen -jg打开隐藏的应用程序,但不将其置于最前面,但对于某些应用程序(如 Mail 和 TextEdit),如果应用程序正在运行但没有打开窗口,它会创建一个新的可见窗口。对于这些应用程序,您可以使用 来pgrep检查应用程序是否已打开。

lsappinfo于 10.9 版新增open -jpgrep于 10.8 版新增。

相关内容