服务类型
Login item
- 不由launchd管理,其他3个是
- 有UI
XPC service
- 无UI,除非是用IOSurface这种方式
Launch Daemon
- 运行在系统上下文中,其他三个运行在用户上下文中
Launch Agent
- 不推荐使用UI
XPC service
- 由单个应用程序管理并为其提供服务
- 可以通过将应用程序重组为主进程和服务,使得服务崩溃的影响会大大减少
Launch Daemon
- 守护进程严格来说是响应低级请求的后台进程
通信机制
- XPC
- 传统的CS通信方式,如Apple事件、TCP/IP、UDP、其他套接字和管道机制
- 远程过程调用,如Mach RPC、Sun RPC和分布书对象
- 内存映射
Launch Agent
- 代理可以与登录用户的上下文中的其他进程以及系统上下文中的守护进程通信
- 它可以显示一个界面,但是不推荐
launchd
- launchd是一套统一的开源服务管理框架,它用于启动、停止以及管理后台程序、应用程序、进程和脚本
- launchd是macOS第一个启动的进程,该进程的PID为1,整个系统的其他进程都是它创建的
- 当launchd启动后,它会扫描
/System/Library/LaunchDaemons
和/Library/LaunchDaemons
中的plist
文件并加载他们 - 当输入密码登录系统后,launchd会扫描
/System/Library/LaunchdAgents
、/Library/LaunchAgents
、~/Library/LaunchAgents
这三个目录中的plist文件并加载它们 - 每个
plist
文件都是一个任务,加载不代表立即运行,只有设置了RunAtLoad
为true
或keepAlive
为true
时,才会加载并同时启动这些任务
plist
launchd
是通过以“.plist”后缀结尾的xml
⽂件来定义⼀个程序的开机⾃启动的,我们⼀般称它为plist
⽂件
创建服务
- 首先编译出一个可执行文件,比如testUecm
- 然后编写plist文件,命名为local.launchd_test_uecm.app.plist
- 需要把文件创建好后放到对应的目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?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>local.launchd_test_uecm.app</string> <key>Program</key> <string>/Users/enlink/code/mycode/testUECM/cmake-build-debug/testUECM</string> <key>ProgramArguments</key> <array> <string>/Users/enlink/code/mycode/testUECM/cmake-build-debug/testUECM</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist> |
- 加载plist文件
1 |
launchctl load ~/Library/LaunchAgents/local.launchd_test_uecm.app.plist |
- 启动该服务
1 |
launchctl start local.launchd_test_uecm.app |
- 其他命令
1 2 3 |
launchctl unload ~/Library/LaunchAgents/local.launchd_test_uecm.app.plist launchctl stop local.launchd_test_uecm.app |
调试
- 附加到进程调试
- 它不显示日志
- 可以在一个死循环断下来
- 也可以显示出它的UI,想办法让它阻塞住
应用
- 一般服务会有保活机制,要调试的话,可能不太方面
- 禁用并关闭服务:
1 2 3 |
sudo launchctl unload -w /Library/LaunchDaemons/com.enlink.uebm.plist sudo launchctl stop /Applications/EnUES.app/Contents/Resources/uebm |
- 这样服务就被紧掉了,用下面命令重新启动也是起不来的
1 2 3 4 5 6 |
// start 命令通常用于启动已经在系统中加载的服务 // 而不是用于加载新的服务 // 加载服务,要用load // 所以用start起不起来 sudo launchctl start uebm sudo launchctl start com.enlink.uebm |
- 要重新启动的话,还是要把禁用的服务打开,就能重新运行了
1 2 3 4 5 6 7 |
// 用于启用或禁用启动项,但不会直接启动服务 sudo launchctl enable system/com.enlink.uebm // 用于加载(启动)一个特定的启动项或服务 // 而 -w 选项用于将该启动项标记为“持久”(persistent) // 以便在下次系统启动时自动启动 sudo launchctl load -w /Library/LaunchDaemons/com.enlink.uebm.plist |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 各平台调试方法总结记述一09/25
- ♥ 51CTO:Linux C++网络编程一08/13
- ♥ Visual Studio:内存泄露AddressSanitizer(跨平台)03/14
- ♥ Macos开发问题:aarch64架构宏不识别06/25
- ♥ macOs 解析mach-o05/11
- ♥ Macos网络信息相关06/06