以编程方式停止和启动守护程序

时间:2014-07-11 09:28:15

标签: ios7 xcode5 daemon jailbreak

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

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

2 个答案:

答案 0 :(得分:3)

可能是最简单的方法。

在您的守护程序plist文件中添加此

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

这样,iOS会因为任何原因(信号,异常,守护进程本身)退出而自动重启你的守护进程。

当您需要重新启动守护程序时,只需调用

即可
exit(0);

答案 1 :(得分:2)

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

以下是您可能想要检查的一些事项:

  1. 您是否在守护程序的plist文件中执行某些操作,该文件会更改其运行的用户?如果您告诉launchd以非root用户身份运行您的守护程序,则可能会阻止您的程序化launchctl命令工作。

  2. 您的plist文件中是否有OnDemand项的条目?通常,你不应该。我想知道你是否这样做,而且它与克雷克答案中的KeepAlive设置有冲突。

  3. 您确定此命令完全launchctl stop com.test.myDaemon)是否可以从命令行获得成功?

  4. 我问的原因是许多人基于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