Mac OS启动服务优化高级篇(launchd tuning)

简介: Mac下的启动服务主要有三个地方可配置:1,系统偏好设置->帐户->登陆项2,/System/Library/StartupItems 和 /Library/StartupItems/3,launchd 系统初始化进程配置。

Mac下的启动服务主要有三个地方可配置:
1,系统偏好设置->帐户->登陆项
2,/System/Library/StartupItems 和 /Library/StartupItems/
3,launchd 系统初始化进程配置。


前两种优化比较简单,本文主要介绍的是第三种更为复杂的launchd配置优化。
launchd是Mac OS下,用于初始化系统环境的关键进程。类似Linux下的init, rc。

我们先来看一下Mac OS X的启动原理:
1,mac固件激活,初始化硬件,加载BootX引导器。
2,BootX加载内核与内核扩展(kext)。
3,内核启动launchd进程。
4,launchd根据  /System/Library/LaunchAgents , /System/Library/LaunchDaemons ,  /Library/LaunchDaemons, Library/LaunchAgents , ~/Library/LaunchAgents 里的plist配置,启动服务守护进程。

看完了Mac OS X的启动原理,我们不难发觉 /System/Library/LaunchAgents , /System/Library/LaunchDaemons ,  /Library/LaunchDaemons, Library/LaunchAgents 五个目录下的plist属性文件是优化系统的关键。

下面再来理解几个基础概念:


/System/Library和/Library和~/Library目录的区别?
/System/Library目录是存放Apple自己开发的软件。
/Library目录是系统管理员存放的第三方软件。
~/Library/是用户自己存放的第三方软件。

LaunchDaemons和LaunchAgents的区别?
LaunchDaemons是用户未登陆前就启动的服务(守护进程)。
LaunchAgents是用户登陆后启动的服务(守护进程)。


开始优化
禁用服务,我们需要用到Mac OS提供的一个工具指令-launchctl

launchctl 指令会针对服务设置一个禁用标志,launchd启动时会先检查这个服务是否被禁用,从而确定是否需要启用这个服务。

禁用服务的方法1
先找到禁用标志文件 /var/db/launchd.db/com.apple.launchd/overrides.plist,查看你要禁用的服务是否已被禁用了。
有些服务已被禁用,但未列在overrides.plist里。此时,你还需要检查这个服务的plist文件Label字段是否已经标记为 Disable。


确认这个服务未禁用后,我们就可以通过调用如下命令,来禁用服务:
sudo launchctl unload plist文件路径
sudo launchctl unload -w plist文件路径
比如,我想禁用spotlight,则输入
sudo launchctl unload /System/Library/LaunchAgents/com.apple.Spotlight.plist
sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.Spotlight.plist

禁用完服务以后,重启Mac OS即可生效。


禁用服务的方法2,一种更有效且暴力的方法(推荐)
先卸载服务
sudo launchctl unload /System/Library/LaunchAgents/com.apple.Spotlight.plist
然后将plist文件mv到其他目录备份。

sudo mv /System/Library/LaunchAgents/com.apple.Spotlight.plist ~/launchd.bak
重启。搞定。是不是很简单!

我个人比较喜欢这种禁用服务的方式,所以推荐一下。

最后,如果发现服务禁用后,系统或软件出现异常,可以通过如下命令,还原服务:
方法1:
sudo launchctl load -wF plist文件路径
方法2:
将备份的plist文件mv回原来的文件夹。
sudo launchctl load plist文件路径


注意:系统级服务的禁用要异常小心,请在禁用前google,确保你熟知这个服务的作用。否则可能导致系统无法启动。
最安全的做法就是不要去禁用它了。

当然,用户服务我们还是可以放心禁用的,有问题最多再启用呗。


下面是我禁用的服务列表:
/System/Library/LaunchDaemons/com.apple.metadata.mds.plist (禁用spotlight的前提)
/System/Library/LaunchAgents/com.apple.Spotlight.plist (Spotlight)
/Library/LaunchDaemons/com.google.keystone.daemon.plist  (Google Software Update)
/Library/LaunchAgents/com.google.keystone.root.agent  (Google Software Update)
~/Library/LaunchAgents/com.google.keystone.agent.plist (Google Software Update,用户下的进程不需要加 sudo)
~/Library/LaunchAgents/com.apple.CSConfigDotMacCert-ken.wug\@me.com-SharedServices.Agent.plist (me.com的共享服务,我不用)
/System/Library/LaunchDaemons/org.cups.cupsd.plist (打印机)
/System/Library/LaunchDaemons/org.cups.cups-lpd.plist (打印机)
/System/Library/LaunchDaemons/com.apple.blued.plist (蓝牙)
/System/Library/LaunchAgents/com.apple.AirPortBaseStationAgent.plist (apple无线基站,我没有这个设备)


顺便给大家介绍一些常见进程:
UserEventAgent 提供用户区程序的事件通知。
TISwitcher 输入法切换。
SystemUIServer 顶部菜单栏。
Dock 底部菜单栏。。
loginwindow window登陆进程,注销什么的。
launchd 不用说了,系统主进程。
fontd 字体进程。
bash shell环境主进程,终端。
Airport基站代理 顾名思义。
pboard 剪贴板,就是复制黏贴。
CCacheServer Kerberos tickets 安全模块,缓存了一些票据,类似密钥。
cvmsComp 跟opengl相关的进程。
kextd 内核扩展服务。
notifyd 系统内消息服务。
diskarbitrationd 磁盘监控服务,响应usb移动硬盘插入,移除等事件。
configd 系统配置,状态监控服务。
syslogd 系统日志。
DirectoryService 文件系统权限验证。
distnoted 外部消息服务,比如iphone, ipad与mac的连接。
ntpd 时间服务。
usbmuxd USB支持。
securityd 安全钥匙。
mDNSResponder DNS支持。
KernelEventAgent 内核事件响应。
hidd 人体工程学设置支持。
fseventsd FSEvent文件系统事件支持。
dynamic_pager 虚拟内存。swap。
dpd display port支持。
autofsd 自动mount网络文件系统。
coreservicesd 核心服务进程。
coreaudiod 音频服务进程。
WindowServer UI界面。
ocspd 对OCRs的安全协议支持。
autofsd 自动mount文件系统,配置在 /etc/auto_master

 

 

 

如何在Mac OS X上创建一个Service服务进程

在Mac上,共有4钟后台进程类型,可以参考Designing Daemons and Services。要实现启动服务,又不依赖于用户,可以使用Launch Daemon。

创建Launch Daemon

  • 运行Xcode,创建一个简单的命令行应用WebTwainService

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #import <Foundation/Foundation.h>
      
    int  main( int  argc,  const  char  * argv[])
    {
      
         @autoreleasepool {
      
             // insert code here...
             NSLog(@ "Hello, World!" );
      
         }
      
         while  (1)
         {
             sleep(100);
         }
         return  0;
    }
  • 编译工程,把WebTwainService放到/Applications/Dynamsoft/WebTwainService.

  • 参考 Create Launch Daemons and Agents,创建配置文件com.dynamsoft.WebTwainService.plist.

 

    • StandardErrorPath & StandardOutPath: service日志文件路径

    • KeepAlive. 设置成true. 一旦WebTwainService异常崩溃, 系统会自动重启服务。

    • Label: 一个唯一值

    • ProgramArguments: 可执行文件路径

  • 这个plist配置文件可放置的地方包括:

 

    • ~/Library/LaunchAgents

    • /Library/LaunchAgents

    • /Library/LaunchDaemons

    • /System/Library/LaunchAgents

    • /System/Library/LaunchDaemons

  • com.dynamsoft.WebTwainService.plist放到/Library/LaunchDaemons下

  • 要成功注册服务,还必须修改目录权限:sudo chown root  /Library/LaunchDaemons/com.dynamsoft.WebTwainService.plist.

  • 命令行中输入sudo launchctl运行launchd

  • 注册服务load -D system /Library/LaunchDaemons/com.dynamsoft.WebTwainService.plist。然后我们可以看到服务被加载了:

  • 输入list可以查看运行的进程

     

  • 现在重启系统,然后打开日志/var/log/webtwain.log,查看服务是否在运行了:

 

技术改变世界! --狂诗绝剑
目录
相关文章
|
5月前
|
人工智能 算法框架/工具 Anolis
Anolis OS 23 基于 AMD 实例的 AI 推理优化实践 | 龙蜥技术
如何使用龙蜥社区容器镜像加速 AI 应用推理部署?
|
4月前
|
iOS开发 MacOS
MAC OS更新系统后IDEA中的SVN报错无法使用
MAC OS更新系统后IDEA中的SVN报错无法使用
|
12月前
|
消息中间件 Dubbo 中间件
在 Docker 中运行 Mac OS 是什么样的体验?
在 Docker 中运行 Mac OS 是什么样的体验?
|
7月前
|
前端开发 安全 Go
在Mac OS X上运行Go语言的GUI程序
在Mac OS X上运行Go语言的GUI程序
200 3
|
8月前
|
机器学习/深度学习 传感器 XML
ubuntu16.04下ROS操作系统学习笔记(四 )机器人系组成、URDF机器人建模、xacro模型优化
ubuntu16.04下ROS操作系统学习笔记(四 )机器人系组成、URDF机器人建模、xacro模型优化
157 0
|
10月前
|
存储 缓存 网络协议
第四章操作系统和硬件优化
第四章操作系统和硬件优化
|
11月前
|
iOS开发 MacOS
MAC OS更新系统后IDEA中的SVN报错无法使用
IntelliJ IDEA无法正常使用SVN 报Cannot run program “svn” (in directory “/XXXX/XXXX/XXXX/XXX”): error=2错误! 解决方法来了!
1034 0
|
Oracle Java 关系型数据库
珠联壁合地设天造|M1 Mac os(Apple Silicon)基于vscode(arm64)配置搭建Java开发环境(集成web框架Springboot)
也许有人从未听说过Python,但是不会有人没听说过Java,它作为一个拥有悠久历史的老牌编程语言,常年雄踞TIOBE编程语言榜首,其顶尖的霸主地位不可撼动,而M1 mac业已发布了一段时间,作为跨时代的顶级芯片系统,这两大巨头能否珠联璧合,让开发者们猛虎添翼、更上层楼?本次我们尝试在M1 mac系统中搭建Java开发环境,并且集成目前Web开发领域红的发紫的Springboot框架,另外,谁说玩儿Java就必须得用Eclipse或者IntelliJ IDEA?我们就骄傲地使用Vscode。
珠联壁合地设天造|M1 Mac os(Apple Silicon)基于vscode(arm64)配置搭建Java开发环境(集成web框架Springboot)
|
Shell 调度 iOS开发
奇技淫巧玄妙无穷| M1 mac os(苹果/AppleSilicon)系统的基本操作和设置
最近有个朋友跟我说,说他新入职了一家公司,公司还不错,给他配了一台Mac,但是呢他以前一直在Windows环境下开发,对Mac os并不了解,他感到很彷徨,所以本次呢,我们来分享一下,当手头儿有一部崭新的Mac,我们应该怎么上手操作和配置,让它成为我们开发的好帮手。
奇技淫巧玄妙无穷| M1 mac os(苹果/AppleSilicon)系统的基本操作和设置
|
机器学习/深度学习 机器人 PyTorch
金玉良缘易配而木石前盟难得|M1 Mac os(Apple Silicon)天生一对Python3开发环境搭建(集成深度学习框架Tensorflow/Pytorch)
笔者投入M1的怀抱已经有一段时间了,俗话说得好,但闻新人笑,不见旧人哭,Intel mac早已被束之高阁,而M1 mac已经不能用真香来形容了,简直就是“香透满堂金玉彩,扇遮半面桃花开!”,轻抚M1 mac那滑若柔荑的秒控键盘,别说996了,就是007,我们也能安之若素,也可以笑慰平生。好了,日常吹M1的环节结束,正所谓剑虽利,不厉不断,材虽美,不学不高。本次我们尝试在M1 Mac os 中搭建Python3的开发环境。
金玉良缘易配而木石前盟难得|M1 Mac os(Apple Silicon)天生一对Python3开发环境搭建(集成深度学习框架Tensorflow/Pytorch)