【问题标题】:Programmatically stop and start daemon以编程方式停止和启动守护进程
【发布时间】:2014-07-11 09:28:14
【问题描述】:

我想从里面阻止我的守护进程。换句话说,当特定事件发生时,守护程序应该停止并重新启动。我正在使用以下命令,它在终端中运行良好,但在守护进程中运行良好。

system("launchctl stop com.test.myDaemon");

【问题讨论】:

  • 您要重新启动它(立即停止并立即启动)?或者你想停止它,等待一个特定的事件,然后再次启动它?这些是非常不同的情况。
  • 我只想停止并重新启动它。

标签: ios7 xcode5 daemon jailbreak


【解决方案1】:

可能是最简单的方法。

在你的守护进程 plist 文件中添加这个

<key>KeepAlive</key>
<true/>

这样,无论出于何种原因(信号、异常、守护程序本身),iOS 都会自动重启您的守护程序。

当你需要重启你的守护进程时,只需调用

exit(0);

【讨论】:

  • 它没有重新启动我的守护进程,我在 plist 文件中有 KeepAlive 键。
  • 您绝对应该看看 Nate 的回答。我的解决方案和你的launchctl stop com.test.myDaemon 加上 KeepAlive 应该可以工作。如果他们不这样做,则意味着您的守护程序可能有问题。
  • 感谢它现在对我有用。问题是退出代码被调用的次数足够多,正如 Nate 在步骤 4 中描述的那样
  • 你是怎么解决的?我猜随机非零退出代码可以工作。
【解决方案2】:

creker's answer 在越狱的 iOS 7.0.4 手机上为我工作。但是,您应该能够使您的 launchctl 也能正常工作(是的,我也测试过)。

您可能需要检查以下几点:

  1. 你是否在你的守护进程的 plist 文件中做一些改变它运行的用户的事情?如果您告诉 launchd 以非 root 用户身份运行您的守护程序,这可能会阻止您的程序化 launchctl 命令工作。

  2. 您的 plist 文件中有 OnDemand 键的条目吗?通常,您不应该这样做。我想知道您是否这样做,并且它与 creker 的答案中的 KeepAlive 设置相冲突。

  3. 您确定此命令完全 (launchctl stop com.test.myDaemon) 从命令行成功吗?

我问的原因是许多人基于a tutorial here 构建他们的启动守护程序。总的来说,这是一个很棒的教程。但是,至少有一个错误。在示例守护进程 .plist 文件中,此处为 Label 的值:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>com.chrisalvares.DLocationDemon.plist</string>

不正确。它不应该是com.chrisalvares.DLocationDemon.plist。它应该只是com.chrisalvares.DLocationDemon。在许多情况下,这并不重要。但是,如果您发出launchctl stop 命令,Label 的名称必须与您传递给launchctl 的名称相匹配。如果你重复了教程中的错误,那么你要么需要修复 plist 文件,要么使用这个命令:

system("launchctl stop com.test.myDaemon.plist");

    4. 最后,可能调用exit(0)会出现问题。首先,如果您运行此程序的次数足够多,并且调用exit(0) 的次数足够多,iOS 可能会将您的进程标记为行为不良的进程,并拒绝继续重新启动它。我认为这些规则在任何地方都没有记录,但是 iOS 中还有其他类似的功能可以这种方式工作。因此,这可能建议使用 launchctl 代替。我的另一个想法是,即使exit(0); 为我工作一次,您也可能应该选择不同的退出代码(而不是 0)。我知道对于 VoIP 应用程序(在某些方面类似于守护程序),iOS 只会在您的应用程序以 非零 退出代码退出时自动重新启动。所以,你可以试试exit(1);

这些是我最好的猜测。

参考文献

https://developer.apple.com/library/mac/documentation/macosx/conceptual/bpsystemstartup/chapters/CreatingLaunchdJobs.html

【讨论】:

  • 谢谢,我已经修好了。正如您在步骤 4 中描述的那样,实际上退出代码被调用了足够多次。
  • @AhadKhan,我想我不明白。如果问题如我在 #4 中描述的那样,并且 iOS 在多次调用 exit(0) 后没有重新启动您的应用程序,那么这不是您应该使用的解决方案。当您接受答案时,您就是在告诉阅读该页面的其他人哪个答案最适合您。
猜你喜欢
  • 2012-09-05
  • 2012-01-24
  • 1970-01-01
  • 2015-08-25
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多