在OS X Yosemite下,启动的作业在错误的时间运行

时间:2014-11-18 03:40:54

标签: plist osx-yosemite launchd

我有很多推出的代理商在我升级到Yosemite之前一直工作正常。手动运行时,作业继续有效。这些工作不是在假设时,而是偶尔自动运行。我不知道是什么触发他们在他们这样做时自己跑,但它并不总是在一天的同一时间,而是在我正在做某事的时候(不是当我从睡眠中唤醒电脑时) )。

我把它归结为我能想到的最简单的工作,只是一个显示作业运行时间的AppleScript命令(所以我可以说时间错了)。我在这篇文章的底部粘贴了plist。 LaunchControl认为作业已加载并显示在launchctl list

$ launchctl list | grep "PID\|show time"
PID     Status  Label
-       0       0 - tmp show time

我的计算机通常在我的计算机上运行。

这是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>0 - tmp show time</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/osascript</string>
        <string>-e</string>
        <string>display dialog (current date) as string</string>
    </array>
    <key>RunAtLoad</key>
    <false/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>7</integer>
        <key>Minute</key>
        <integer>45</integer>
    </dict>
</dict>
</plist>

4 个答案:

答案 0 :(得分:0)

潜在解决方案

我正在运行LaunchControl并且我注意到它显示了关于我的一个工作的警告:

  

程序参数包含globbing符号,但launchd不支持shell globbing。这可能是故意的

有问题的通配符号并未用于通配;它们是网址的一部分:http://www.weather.com/weather/hourbyhour/graph/New+York+NY+10014:4:US?pagenum=2。虽然这项工作自Yosemite问世以来一直存在,但删除它似乎已经解决了这个问题,尽管我并不相信它已经100%完成了。


解决方法

由于没有人拥有他们所知道的完整解决方案,我将离开这个解决方法:

我仍然不知道发生了什么,但这是一个有点不愉快的解决方法。我注意到加载和卸载打破了logjam,因此在crontab中添加了一个条目来卸载然后重新加载一些launchd项目。因此,我正在使用cron(你应该尽可能避免支持在Mac OS下启动)来推出。我运行crontab -e然后将其粘贴在文件中:

50 * * * * launchctl unload '/Users/kuzzooroo/Library/LaunchAgents/foo bar.plist' && launchctl load '/Users/kuzzooroo/Library/LaunchAgents/foo bar.plist'

答案 1 :(得分:0)

我遇到了同样的问题 - 它在我升级到优胜美地并在第二天破产前一天工作。手动运行仍然有效,但定时发射将在数小时后运行。我在日志中注意到了很多这些项目:

2/18/15 8:05:36.000 AM内核[0]:进程suhelperd中的BUG [454]:过度释放的传统外部升压断言(共1个,1个外部,0个遗留外部)

suhelperd是软件更新程序助手守护程序

我进入系统偏好设置/ App Store并关闭所有自动更新。

今天早上,我的经纪人再次准时完成,日志中的条目消失了。

答案 2 :(得分:0)

我一直无法找到一种可靠的方法将这项工作完全放在launchd内,但这里的解决方法似乎对我有用:从plist中移除StartCalendarInterval部分,以及运行crontab -e创建一个cron作业来启动相关任务:

50 * * * * launchctl start start.example.taskName

当然,您可以跳过launchd并直接使用cron来启动工作。对于我的特定情况,这不起作用(我正在根据加载到内存中的某些ssh凭据进行git pulllaunchd / launchctl正确处理但是哪个独立cron cron 1}}没有),但{{1}}适用于很多情况。

答案 3 :(得分:0)

如果您的crontab条目指定计算机处于睡眠状态的时间,则“pron”不起作用。我必须做的是改变我的工作,阅读包含上次运行日期的“邮票文件”。如果今天的日期与戳记日期相符,则该作业退出。但如果不同的话,它会用今天的日期重写邮票,并完成它的工作。至少就是这样,它只在ONCE完成它的工作,但是“cron”每隔30分钟就会启动它。我的crontab看起来像这样:15,45 * * * * / Users / etc.