解决 macOS 上的 mds_store 高 CPU 占用并停用 Spotlight 索引

最近在使用 macOS 时,htop 的时候发现几个核的cpu都是100%满负荷运行,往下再查了一下,发现 mds_store 这个进程占用大量 CPU 资源,系统也非常卡顿(虽然不一定是这个进程造成的)。

mds_store 是 macOS Spotlight 索引服务的一部分,负责管理文件的元数据,让我们可以快速通过 Spotlight 搜索文件、邮件、应用等内容。当系统文件发生变化时(比如文件创建、修改、删除等),mds_store 就会进行重新索引,因此可能会占用大量的 CPU 资源,特别是在以下几种场景下:

  • 文件频繁变动:比如大量文件的操作,像是开发项目、下载大文件等。
  • 外接硬盘或网络驱动器:如果连接了外部存储设备,Spotlight 也会索引这些内容。
  • Spotlight 索引损坏:有时候 Spotlight 的索引会损坏,导致系统反复尝试重新索引。
  • 系统更新后重新索引:每次 macOS 大更新后,Spotlight 需要重新为整个系统创建索引。

mds_store 高 CPU 占用

  1. 重建 Spotlight 索引:有时候 Spotlight 的索引可能会出现问题,最简单的解决办法就是重建索引。打开终端,输入以下命令来删除并重建 Spotlight 的索引:

    sudo mdutil -E /
    
  2. 排除某些文件或文件夹:如果有一些文件夹不需要索引,可以将它们从 Spotlight 中排除掉:

    • 打开 系统偏好设置Spotlight隐私。 - 点击 +,选择那些不想索引的文件夹,比如外接硬盘、开发项目目录等。
  3. 关闭外接驱动器的索引:如果我们使用外接硬盘或网络驱动器,Spotlight 可能也会试图索引它们。关闭某个特定驱动器的索引:

    sudo mdutil -i off /Volumes/ExternalDrive
    

    替换 ExternalDrive 为实际的卷名,这样 Spotlight 就不会再去索引外接硬盘上的文件了。

  4. 检查大型文件或数据库:一些大型文件(如邮件库、照片库等)可能会让 Spotlight 花费大量时间去索引。如果这些数据不需要搜索,可以将它们排除在外。

停用 Spotlight 索引

有些时候我们不需要 Spotlight 的全局搜索功能,也可以停用 Spotlight 索引。方法很简单,可以通过终端来完全关闭 Spotlight:

  1. 完全停用 Spotlight

    sudo mdutil -a -i off
    

    这会关闭所有卷上的 Spotlight 索引。关闭后,系统不会再为文件、邮件等内容建立索引,搜索功能也会被停用。如果之后想再次启用 Spotlight,只需执行以下命令:

    sudo mdutil -a -i on
    
  2. 停用特定卷的索引

    sudo mdutil -i off /Volumes/YourVolumeName
    

    这样 Spotlight 只会关闭指定卷的索引,不影响系统其他部分的搜索功能。

  3. 停用 mds 进程(不建议)

    其实,强行终止 mdsmdworker 进程也是一种方式,但 macOS 会定期重新启动这些进程。所以更推荐使用 mdutil 命令进行停用。如果坚持要这么做,可以运行以下命令:

    sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
    

    这个命令会停止 mds 进程,但是我不推荐,因为这可能会影响系统的一些其他功能。

虽然 Spotlight 是 macOS 中非常强大的搜索工具,但有时候它也会给系统带来不小的负担。根据实际需求,适当地调整 Spotlight 的行为,甚至在必要时完全停用它,能够显著改善系统的性能。


mac studio 强制重启

老问题了,我的 mac studio M2 Max按下开机键,正面右下角的白色呼吸灯会弱亮度缓慢闪,但是就是不启动。正常情况下,应该是大灯常量状态。

用了如下方法强制重启:

  1. 拔下电源插头
  2. 长按电源按钮10s左右
  3. 插入电源,此时变为黄色呼吸灯闪亮
  4. 长按电源按钮10s左右,此时变为黄色灯常亮
  5. 正常按下电源,此时变为白色灯常亮

在 macOS 上禁用 GoogleUpdater

在运行 ps aux 命令时偶然发现 GoogleUpdater ,我更倾向于手动管理更新。所以决定禁用它,步骤如下:

1. 终端删除更新程序

打开终端,输入以下命令来删除 Google Software Update:

sudo rm -rf /Library/Google/GoogleSoftwareUpdate

再删除自动启动的服务:

sudo rm -rf /Library/LaunchAgents/com.google.keystone.agent.plist
sudo rm -rf /Library/LaunchDaemons/com.google.keystone.daemon.plist

2. 禁用自动更新检查

在终端中设置更新间隔为 0,彻底禁用后台自动更新:

defaults write com.google.Keystone.Agent checkInterval 0

3. 停止活动的定时任务

launchctl 查看并停止 Google 的更新服务:

launchctl list | grep google
sudo launchctl unload -w /Library/LaunchAgents/com.google.keystone.agent.plist
sudo launchctl unload -w /Library/LaunchDaemons/com.google.keystone.daemon.plist

macOS 每秒钟强杀 `idleassetsd` 进程

前文提要:Mac Sonoma 删除不必要的视频壁纸

最近发现 macOS 上的 idleassetsd 进程在后台消耗了大量带宽。这个进程负责下载壁纸,但对于我来说完全没用。

image-20240926下午65031892

在网上也搜到了大量的相关情况:

单纯kill掉还不行;

sudo killall idleassetsd

大概2s左右又会重新拉起来。无奈,写个脚本 kill_idleassetsd.sh 强杀吧。

#!/bin/bash

while true; do
    sudo killall idleassetsd
    sleep 1  # 等待1秒
done

image-20240926下午71219298


macOS 15 界面无响应

昨天刚升级了macOS 15,今天遇到了一个奇怪的问题:macOS 15 突然卡住了,UI 界面无法进行任何操作。

image-20240926下午72332771

鼠标可以动,网易云音乐正常播放,AirPods 下一曲没问题,但鼠标点击无反应,键盘输入也无效。不过,我还能通过 SSH 从其他设备远程登录到这台电脑。觉得问题出在 UI 层面,而非整个系统挂了。

试了一些常见的修复办法,比如通过 SSH 重启 Dock 和 Finder,kill -9,osascript -e 'tell application "System Events" to log out'之类的,都没有效果。

这里记录几个命令

loginwindow

强制登出用户:

sudo killall -HUP loginwindow
  • killall 是一个用于终止或向多个同名进程发送信号的命令。

  • -HUPSIGHUP 信号的缩写,代表“挂起”(Hangup),这个信号最初是在终端断开时发送的。

    对进程而言,HUP 信号通常表示让进程重新加载配置文件,或者在某些情况下,重启进程。

    对于 loginwindow 进程,HUP 信号的效果是强制重启 loginwindow,从而使用户被注销并重启登录界面。

这个命令会重启 loginwindow 进程,相当于强制注销当前用户并重启登录窗口。在执行这个命令后,我的系统立即退出当前用户会话,回到登录界面,再次登录后,系统恢复了正常操作。

另外,也不用过于担心刚才打开的文件没有保存之类的问题。大部分的软件在登陆后都会恢复状态,只有需要保持远程连接之类的app,才可能会被退出。

WindowServer

sudo killall -HUP WindowServer

SystemUIServer

killall SystemUIServer

Finder

killall Finder

Windows 使用短文件名删除 “无法找到指定文件” 的文件夹

最近 Windows 7 桌面上有几个文件夹,其中一个文件夹名称为:“2023.05.08 【POC】某司POC”。每次尝试删除时都会提示“系统找不到指定的文件”,而且无论是通过右键删除,还是使用命令提示符,都无法成功。

image-20240923上午84809860

经过排查,发现可能是由于文件夹名中包含空格、特殊字符(比如【】)等导致的。Windows某些情况下会无法正确识别带有特殊字符或过长的路径文件,导致删除失败。

解决思路

Windows 文件系统有个特性:8.3文件名。8.3文件名(或简称8.3)是FAT文件系统的一种文件命名规范。 在与“长文件名”并称时可以称为短文件名。 广泛影响于采用FAT文件系统且不支持VFAT的DOS和Windows操作系统(如Windows 95、Windows NT 3.5及以前的版本)中。

这是一种兼容DOS时代遗留的文件命名机制,允许文件使用简短的名字。通过这个特性,可以绕过空格和特殊字符的问题,成功删除文件夹。

操作步骤

第一步:进入文件夹所在目录
  1. 打开命令提示符(以管理员身份运行)。
  2. 通过 cd 命令进入文件所在的目录。

    cd "C:\Users\YourUsername\Desktop"
    
第二步:查看文件夹的短文件名
  1. 在命令提示符中,使用 dir /x 命令列出目录中的所有文件和文件夹,同时显示它们的短文件名(8.3格式):

    dir /x
    
  2. 输出结果会显示文件夹的短名称。例如,我的文件夹“2023.05.08 【POC】阿里 POC” 对应的短文件名是 “202305~1.08” 这样的格式。短文件名的长度通常是前6个字符加上一个数字后缀。

第三步:删除文件夹
  1. 找到短文件名后,使用 rd 命令删除文件夹。仍然使用我的文件夹为例:

    rd /s /q 202305~1.08
    
    • /s:删除文件夹及其所有子文件和子文件夹。
    • /q:安静模式,不提示确认直接删除。

    如果是文件,用这个命令:

    del /f /q 202305~1.08
    
  2. 执行这个命令后,文件夹成功被删除。

参考资料


将 Homebrew 安装的 MacVim 显示在 `/Applications` 文件夹中

在 macOS 上使用 Homebrew 安装软件时,应用程序通常会存放在 Homebrew 的专用目录下,不会自动出现在系统的 /Applications 文件夹中。本文记录将 Homebrew 安装的 MacVim.app 添加到 /Applications 文件夹中。

方法一:手动创建符号链接

  1. 首先,确定 Homebrew 安装的 MacVim.app 的路径:

    which mvim
    

    一般位于 /opt/homebrew/Cellar/macvim/9.1.0727/ 的路径。

  2. 进入终端后,使用 ln 命令创建符号链接:

    ln -s /opt/homebrew/Cellar/macvim/9.1.0727/MacVim.app /Applications/MacVim.app
    

注意:当 macvim 版本更新时,路径可能会发生变化,届时需要根据新路径再次创建符号链接。

方法二:手动复制 .app 文件

  1. 打开终端并运行以下命令:

    cp -r /opt/homebrew/Cellar/macvim/9.1.0727/MacVim.app /Applications/
    

方法三:使用 brew install --cask macvim

对于那些想让 Homebrew 自动管理应用程序,并直接将 .app 文件安装到 /Applications 的用户,推荐使用 Homebrew 的 cask 版本。

Cask 是 Homebrew 提供的一个扩展,专门用于安装 macOS GUI 应用程序。通过使用 cask,可以避免手动创建符号链接或复制应用程序,Homebrew 会自动将应用程序安装到 /Applications

  1. 首先,卸载通过 Homebrew 正常安装的 macvim

    brew uninstall macvim
    
  2. 然后使用 cask 安装 macvim

    brew install --cask macvim
    

    这样,MacVim.app 会自动安装到 /Applications,无需手动干预。