macOS 使用launchd 进程来管理守护进程(Daemons)和代理进程(Agents),所以在使用macOS 的系统时,可以使用它来运行shell脚本。在macOS系统启动期间,launchd是内核运行以设置计算机的第一个进程,其他的守护进程如开机自启动脚本都由launchd来启动。
通过查看以下文件夹中的配置文件,可以了解由launchd管理的各种守护进程和代理进程
-
/System/Library/LaunchDaemons Apple 提供的系统守护进程
-
/System/Library/LaunchAgents Apple 提供的代理进程,适用于所有用户
-
/Library/LaunchDaemons 第三方应用的系统守护进程
-
/Library/LaunchAgents 第三方应用提供的代理进程,适用于所有用户
-
~/Library/LaunchAgents 第三方应用提供的仅应用于当前登录用户的代理进程
那么守护进程和代理进程有什么异同呢?守护进程和代理进程都是后台服务的别称,它们通常对用户是不可见的。守护进程是一个以root权限运行且不需要用户登录的进程,是在系统级执行任务的;而代理进程在每次用户登录时以用户权限运行,在用户交互会话的上下文中执行任务,所以它也被称为用户代理,代理程序还可以访问图形子程序,因此可以向用户呈现GUI。守护进程和代理进程在何时、如何启动、保持活动状态的时间取决于它们的plist配置, 配置文件就位于上面列的文件夹中。(通过man launchd.plist 可以查看配置的说明)
我们不直接与launchd交互,而是使用launchctl命令加载(load)或卸载(unload)被launchd启动的守护进程和代理(launchtcl也可以管理XPC服务)。下面是常用的launchctl的命令
# 1.显示当前的启动脚本
launchctl list
# 2. 设置开机启动并立即启动改服务
launchctl load -w **.pist
# 3. 设置开机启动但不立即启动服务
launchctl load **.pist
# 4. 停止正在运行的启动脚本
launchctl unload **.pist
# 5. 再加上-w选项即可去除开机启动
launchctl unload -w **.pist
# 注意这些命令有时可能要加sudo才有权限执行
如果想查看一个进程的守护进程,可以先找到进程对应的进程id,然后用grep 看lauchctl list的结果就可以得到相应的守护进程
# 比如查看一个foo的进程,当然也可用 ps -ef |grep foo来查看
$ pgrep -fl foo
40679 bash /tmp/foo
# 再看进程对应到的守护进程是哪个
$ launchctl list|grep 40679
40679 - com.example.foo
参考: