launchd官方文档>>
详解文章1>>
详解文章2>>
来自于官方文档:”Wikipedia defines launchd as "a unified, open-source service management framework for starting, stopping and managing daemons, applications, processes, and scripts. Written and designed by Dave Zarzycki at Apple, it was introduced with Mac OS X Tiger and is licensed under the Apache License."
可以理解为,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
时,才会加载并同时启动这些任务。
守护进程,英⽂叫Daemon
,守护进程其实就是在后台运⾏的程序,它没有界⾯,你看不到它,⼀般使⽤命令来对它进程管理控制,守护进程常被设置为开机⾃动启动(当然也可以开机后⼿动⽤命令启动),很多软件的“服务器端”⼀般都是以守护进程的⽅式运⾏,⽐如数据库 、内存缓存 、Web服务器 等等都是以守护进程⽅式运⾏的,它们通过“接⼝”对外提供服务(如Unix socket / tcp ⽅式等等)。
Daemons
和Agents
都是launchd所管理的后台程序,它们的区别是Agent是属于当前登录⽤户(就是你开机后输⼊密码时的那个⽤户名),它们是以当前登录的⽤户权限启动的,⽽Daemon则属于root⽤户,但由于有root⽤户权限,所以它可以指定以什么⽤户运⾏,也可以不指定(不指定就是以root⽤户运⾏)。
launchd
是通过以“.plist”后缀结尾的xml
⽂件来定义⼀个程序的开机⾃启动的,我们⼀般称它为plist
⽂件。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSProcessInfo *proc = [NSProcessInfo processInfo];
NSArray *args = [proc arguments];
// insert code here...
NSLog(@"%@",args[1]);
NSLog(@"Hello, World!");
}
return 0;
}
ctrl +B编译成一个可执行程序launchd_test
launchd会读取.plist文件,进而决定如何启动该进程
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 <plist version="1.0">
4 <dict>
5 <key>Label</key>
6 <string>local.launchd_test.app</string>
7 <key>Program</key>
8 <string>/Users/mac/Documents/launchd_test</string>
9 <key>ProgramArguments</key>
10 <array>
11 <string>/Users/mac/Documents/launchd_test</string>
12 <string>happy</string>
13 </array>
14 <key>RunAtLoad</key>
15 <true/>
16 </dict>
17 </plist>
Label
为需要启动的进程设置一个标签,这里起名为local.launchd_test.app
Program
设置为需要启动的可执行程序的路径
ProgramArguments
设置为程序运行需要的参数,第一个参数即为main
函数中的argv[0]
RunAtLoad
设置为是否在加载时启动,设置为true
则在launchd
加载时就启动,false
则需要手动启动
将此文件命名为local.launchd_test.app.plist
对于用户代理进程,我们将.plist文件放到~/Library/LaunchAgents.文件中,对于守护进程,我们将其放到/Library/LaunchDaemons文件中
列出所有由launchd管理的进程
launchctl list
查看某个具体的进程
host:~ user$ launchctl list | grep com.example.app
- 2 com.example.app
1.首先,创建完.plist文件后,需要加载该文件,
launchctl load ~/Library/LaunchAgents/local.launchd_test.app.plist
正常不会输出任何东西,如果输出
Load failed: 5: Input/output error
Try running `launchctl bootstrap` as root for richer errors.
可以尝试
launchctl unload ~/Library/LaunchAgents/local.launchd_test.app.plist
launchctl load ~/Library/LaunchAgents/local.launchd_test.app.plist
2.launchd启动代理进程
launchctl start local.launchd_test.app
此时,可以通过launchctl
list查看到launchd_test
的进程号
launchctl list | grep local.launchd_test.app
卸载、关闭命令
launchctl unload ~/Library/LaunchAgents/local.launchd_test.app.plist
launchctl stop local.launchd_test.app
通过launchd启动进程后,bash上看不到输出,如果需要查看输出,需要将NSLog输出重定向到指定文件夹===》