Macos 作为守护进程启动应用程序-Mac OS X

Macos 作为守护进程启动应用程序-Mac OS X,macos,launchd,Macos,Launchd,我的应用程序是一个Web服务器。它在Windows上作为服务运行,在Linux上作为守护进程运行。应用程序本身也支持同样的功能。e、 g MyWebServer -s 将其作为服务安装并在Windows上运行 MyWebserver -d 在Linux上作为守护进程运行(尽管也可以使用脚本) 在MacOSX上,所有帖子都指向 launchctl 它需要一个plistxml文件 我只想让我的用户键入 sudo ./MyWebServer -s 它应该自动将MyWebServer实例安装为

我的应用程序是一个Web服务器。它在Windows上作为服务运行,在Linux上作为守护进程运行。应用程序本身也支持同样的功能。e、 g

MyWebServer -s
将其作为服务安装并在Windows上运行

MyWebserver -d 
在Linux上作为守护进程运行(尽管也可以使用脚本)

在MacOSX上,所有帖子都指向

launchctl
它需要一个plistxml文件

我只想让我的用户键入

sudo ./MyWebServer -s
它应该自动将MyWebServer实例安装为一个“launchd”守护进程,设置为从计算机启动并在后台静默运行

我见过一些没有任何plistxml文件的应用程序这样做。如何在应用程序中添加对相同内容的支持。我的服务器是用C/C编写的++


Edit:我不想在OS X中使用fork方法,而是推荐的启动守护进程

如果您想让某个进程作为deamon运行,只需将其与终端分离即可。通常的最低方法是:

if (fork()!=0) {
  exit(0);
}
// do the job
这将创建一个孤立进程,init将采用该进程


如果您想提供启动时启动和
launchd
控制,请查看OSX上的
/Library/LaunchDaemons

您可以尝试调用
launchctl
并使用其
submit
选项,该选项将允许您在不使用配置文件的情况下提交程序。阅读该手册了解更多信息。

您似乎很难理解,在用户看不见的OSX中,在后台运行启动守护程序应该像在windows中创建带有一行文本的服务一样简单。这只是Windows的安全性很差的原因之一,恶意软件可以像马戏团的露天水池一样在其中到处乱跑

<>你说你用C++编码,遵守OSX并不意味着在启动列表中获取你的可疑守护进程的合法性。 您需要将编译后的程序复制到主文件夹。 然后需要为其创建一个.plist文件,其中包含所有正确的详细信息。 然后将.plist文件复制到/launchdaemons目录(需要root访问) 然后,您将再次需要root访问权限,以便在plist文件的新位置使用chroot注册和更改所有权。 最后,直接向launchd本身注册它(需要根访问权限)


如果您的守护进程正在执行任何高度可疑的操作,加载/卸载kext模块或编辑此类重要文件,则SIP将拒绝该操作,您将A)转到苹果并获得认证,或B)手动在恢复模式下禁用SIP

您正在将苹果与橙子进行比较。与您在Linux下的OSX上所要做的等效操作是a)安装初始化脚本b)将此初始化脚本添加到适当的运行级别,c)调用启动服务器的所述初始化脚本。因此,您应该使用安装程序生成器或编写适当的端口文件(适用于MacPorts)或brew用作其安装程序例程控制文件的任何内容。@MarkusWMahlberg我只向我的客户提供服务器可执行文件。在没有初始化脚本的情况下,它们是如何在Linux下自动启动的,这是您在OSX下要做的。@MarkusWMahlberg我们可以通过分叉或简单地使用daemon()函数从内部添加守护程序支持。自动启动是第二个问题,首先它应该作为守护进程运行。我见过应用程序在mac上运行,这应该是可能的。如果你尝试在OSX上构建与Linux相同的fork和Daemoning代码,会发生什么?这既不能回答我的问题,也不能增加任何知识。我需要一个“发射”daemon@adnankamili-明显不真实。即使在最初的版本中,它也回答了您在评论中实际提出并澄清的问题——特别是它完成了与您的Linux示例相同的事情。如果它没有增加你的知识,那就是你没有提出更精确的问题的错。@ChrisStratton我的问题特别提到“launchd”守护程序你的问题显示了一个没有使用等效程序的Linux示例,在你特别邀请的评论中,“自动启动是第二个问题,首先它应该作为守护程序运行。”当你得到你想要的东西时,不要抱怨。@adnankamili你不需要启动守护程序,你认为你需要一个。只需作为守护进程运行
fork
posix\u spawn
就可以完成任务。我可以通过
launchctl submit-l--/path/to/app
完成这项任务。我认为AppLabel只是为了显示。