launchctl及其配置、使用、示例

文章目录
- launchctl 是什么
- Unix / Linux类似的工具有什么
- 哪个更常用
- 配置
- 使用
- 常用子命令
- 示例
- 加载一个 launch agent:
- 卸载一个 launch daemon:
- 列出所有已加载的服务:
- 启动一个服务:
- 停止一个服务:
- 禁用一个服务:
- 启用一个服务:
- 附com.example.myagent.plist内容
- 有趣的例子
- 参考
launchctl 是什么
launchctl 是 macOS 操作系统中的一个命令行工具,它用于与 launchd 守护进程进行交互。launchd 是 macOS 的服务管理框架,负责启动、停止和管理系统级和用户级的守护进程、应用程序、脚本和其他进程。launchctl 可以用于加载、卸载、启动、停止和管理这些进程的配置文件,这些配置文件通常称为 “launch agents”(用户级别)和 “launch daemons”(系统级别),并以 .plist(Property List)文件格式存储。
Unix / Linux类似的工具有什么
在 Unix/Linux 系统上与 macOS 的 launchctl 命令类似的工具和服务管理框架主要有以下几个:
-
Systemd (systemctl)
systemd 是现代 Linux 发行版中广泛使用的系统和服务管理器,替代了传统的 System V init 系统。与 launchctl 类似,systemd 使用 systemctl 命令来管理服务,包括启动、停止、重启、启用和禁用服务。服务配置通常通过位于 /etc/systemd/system/ 或 /usr/lib/systemd/system/ 的 .service 文件来定义。 -
Upstart (initctl)
在 systemd 出现之前,Upstart 是某些 Linux 发行版(如早期的 Ubuntu 版本)使用的替代 init 系统。它提供 initctl 命令来管理服务。虽然 Upstart 目前已经被许多发行版淘汰,但仍可能在一些较旧的系统中找到。 -
SysVinit (/etc/init.d scripts)
SysVinit 是早期 Unix 和 Linux 系统使用的传统初始化系统。它使用脚本位于 /etc/init.d/ 的目录来启动和停止系统服务。虽然现代发行版已经转向 systemd,但某些系统仍然支持 SysVinit 脚本,或者提供与 systemd 的兼容层。 -
Cron (crontab)
对于定时任务,cron 是 Unix/Linux 系统上的传统工具。它不是服务管理器,但可以定时运行任务。用户可以通过 crontab 命令来编辑个人的定时任务列表,系统级的 cron 任务则配置在 /etc/cron.* 目录下。
每个工具和框架都有其独特的特点和用法,但它们的基本功能——确保在指定的时间或条件下运行或停止程序和脚本——和 launchctl 类似。随着 Linux 发行版向 systemd 迁移,systemctl 已成为服务管理的事实标准。
哪个更常用
在现代 Linux 发行版中,systemd(及其工具 systemctl)是最常用的服务管理和初始化系统。自从它于 2010 年引入以来,systemd 已经取代了传统的 SysVinit 和 Upstart,并且被许多主流 Linux 发行版采用,包括:
Fedora
Debian(从 Debian 8 “Jessie” 开始)
Ubuntu(从 Ubuntu 15.04 “Vivid Vervet” 开始)
CentOS(从 CentOS 7 开始)
Red Hat Enterprise Linux(从 RHEL 7 开始)
SUSE Linux Enterprise Server
openSUSE
systemd 提供了对系统服务的集中管理,它不仅仅用于启动和停止服务,还管理系统启动过程、挂载点、定时任务(替代 cron)、日志记录(通过 journald)等。systemctl 命令是与 systemd 交互的主要方式,它允许你启动和停止服务、查看服务状态、启用和禁用服务的自动启动等。
SysVinit 仍然在一些较旧的系统或特定的环境中被使用,尤其是在那些对 systemd 的复杂性和特性有所保留的情况下。
cron 在定时任务方面也依然非常普及,尽管 systemd 提供了定时器(timers)功能来替代它,但许多系统管理员和用户出于习惯或者对 cron 熟悉程度的考虑,依然选择使用 cron。
在 macOS 系统中,launchctl 与 launchd 结合,仍然是管理守护进程、应用程序和其他自动启动任务的标准工具,没有直接的 Linux 对应物。
综上所述,在 Linux 环境中,systemd 和 systemctl 目前是最常用的,而在 macOS 上,则是 launchctl。
配置
launchd 通过 .plist 配置文件来管理任务。这些文件通常位于以下目录:
- /System/Library/LaunchDaemons/:存放系统级守护进程配置文件,由系统所有者或管理员管理。
- /Library/LaunchDaemons/:存放第三方应用程序的系统级守护进程配置文件。
- /System/Library/LaunchAgents/:存放系统级代理配置文件。
- /Library/LaunchAgents/:存放第三方应用程序的用户级代理配置文件。
- ~/Library/LaunchAgents/:存放用户级代理配置文件,只影响当前用户。
.plist 文件包含了用于描述服务的键值对,例如要执行的命令、启动条件、环境变量等。
使用
launchctl 的基本使用语法如下:
- launchctl <subcommand> …
<subcommand> 是指定给 launchctl 的子命令,用于执行各种操作,如 load, unload, start, stop, list 等。
常用子命令
*load: 加载指定的 .plist 文件到 launchd。
- unload: 卸载指定的 .plist 文件,停止对应的服务。
- start: 启动一个由 .plist 文件定义的服务。
- stop: 停止一个由 .plist 文件定义的服务。
- list: 列出已加载的服务。
- enable: 启用指定的服务。
- disable: 禁用指定的服务。
示例
以下是一些使用 launchctl 的示例:
加载一个 launch agent:
launchctl load ~/Library/LaunchAgents/com.example.myagent.plist
这将加载用户级别的 com.example.myagent 服务。
卸载一个 launch daemon:
sudo launchctl unload /Library/LaunchDaemons/com.example.mydaemon.plist
这将卸载系统级别的 com.example.mydaemon 服务。注意,对于系统级别的操作通常需要 sudo。
列出所有已加载的服务:
launchctl list
使用这个命令可以查看所有当前由 launchd 管理的服务。
启动一个服务:
launchctl start com.example.myagent
如果 com.example.myagent 已经加载,这个命令会启动它。
停止一个服务:
launchctl stop com.example.myagent
这将停止 com.example.myagent 服务。
禁用一个服务:
sudo launchctl disable system/com.example.mydaemon
禁用名为 com.example.mydaemon 的系统级服务。
启用一个服务:
launchctl enable user/<UID>/com.example.myagent
启用某个用户(UID 指定)的 com.example.myagent 服务。
随着 macOS 版本的更新,launchctl 的命令和语法可能发生变化。因此,建议查看系统中的 man launchctl 手册页面或官方 Apple 开发者文档以获取最新的使用信息和命令格式。
附com.example.myagent.plist内容
一个典型的 com.example.myagent.plist 文件,包含了 launchd 服务所需的配置信息。它通常以 XML 格式定义,并且遵循 Property List(plist)的格式。以下是一个示例 .plist 文件的内容,它配置了一个每10秒运行一次的示例任务:
<?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><!-- Label for the job --><key>Label</key><string>com.example.myagent</string><!-- Program to execute --><key>ProgramArguments</key><array><string>/usr/bin/say</string><string>Hello, world!</string></array><!-- Run at load --><key>RunAtLoad</key><true/><!-- Keep the job alive, always run it --><key>KeepAlive</key><false/><!-- StartInterval in seconds --><key>StartInterval</key><integer>10</integer><!-- Environment variables --><key>EnvironmentVariables</key><dict><key>PATH</key><string>/usr/bin:/bin:/usr/sbin:/sbin</string></dict><!-- Standard output and error paths --><key>StandardOutPath</key><string>/tmp/com.example.myagent.out</string><key>StandardErrorPath</key><string>/tmp/com.example.myagent.err</string>
</dict>
</plist>
在这个例子中:
- Label: 服务的唯一标识符。
- ProgramArguments: 要执行的命令和参数,这里的例子是使用 /usr/bin/say 命令让系统朗读一段文本。
- RunAtLoad: 是否在加载 .plist 文件时立即运行服务(这里是 true)。
- KeepAlive: 服务是否应该保持运行,这里设置为 false。
- StartInterval: 服务运行的间隔,单位为秒。这里设置为每10秒运行一次。
- EnvironmentVariables: 在运行服务时要使用的环境变量。
- StandardOutPath 和 StandardErrorPath: 服务的标准输出和错误输出将被重定向到的文件路径。
请注意,上述 .plist 文件只是一个简单例子,用于演示如何定义一个定时运行的任务。在实际情况中,你可能需要根据需要配置更为复杂的任务,并且安全地存储日志和输出。
为了使用该服务,你需要将这个 .plist 文件放置在合适的位置,通常是 ~/Library/LaunchAgents/,然后使用 launchctl 加载它。记得根据你的 macOS 版本检查 launchctl 的具体使用方法,因为命令和语法可能会有所不同。
有趣的例子
让我们创建一个有趣的 launchctl 例子,我们将设置一个简单的 launch agent 任务,它将每天在指定的时间用 macOS 的语音合成功能朗读一句鼓励的话或者笑话。这样,每天在一个固定的时间,你的电脑就会给你一些积极的能量或一个笑容。
首先,你需要创建一个 .plist 文件,比如叫做 com.user.encouragement.plist,并保存到你的 ~/Library/LaunchAgents/ 目录下。
<?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>com.user.encouragement</string><key>ProgramArguments</key><array><string>/usr/bin/say</string><string>Remember, you are awesome!</string></array><key>RunAtLoad</key><false/><key>StartCalendarInterval</key><dict><key>Hour</key><integer>9</integer><key>Minute</key><integer>30</integer></dict>
</dict>
</plist>
在这个例子中,ProgramArguments 指定了要执行的命令,这里是 say 命令,后面跟着要朗读的句子 “Remember, you are awesome!”。RunAtLoad 设置为 false,表示不会在加载时执行。StartCalendarInterval 设置了任务应当执行的时间,这里是每天的早上 9:30。
保存了这个 .plist 文件之后,你可以使用以下 launchctl 命令来加载和启动这个任务:
launchctl load ~/Library/LaunchAgents/com.user.encouragement.plist
为了确保这个任务在你的电脑重启后继续工作,你需要将它设为启动时自动加载。因为我们已经使用 launchctl load 命令加载了这个任务,它将在下一个登录时自动启动。
如果你想要测试看看这个任务是否按预期工作,可以手动触发:
launchctl start com.user.encouragement
这将立即执行这个任务,你应该能听到你的电脑用语音朗读 “Remember, you are awesome!”。
如果你想卸载这个任务,可以使用:
launchctl unload ~/Library/LaunchAgents/com.user.encouragement.plist
这个小例子是一个简单而又有趣的 launchctl 的应用,证明了你可以用它来给日常电脑使用带来一些乐趣和积极的能量。
参考
Script management with launchd in Terminal on Mac
相关文章:
launchctl及其配置、使用、示例
文章目录 launchctl 是什么Unix / Linux类似的工具有什么哪个更常用配置使用常用子命令示例加载一个 launch agent:卸载一个 launch daemon:列出所有已加载的服务:启动一个服务:停止一个服务:禁用一个服务:启用一个服务: 附com.example.myagent.plist内容有趣的例子参考 launch…...
如何在Ubuntu系统搭建Excalidraw容器并实现公网访问本地绘制流程图
文章目录 1. 安装Docker2. 使用Docker拉取Excalidraw镜像3. 创建并启动Excalidraw容器4. 本地连接测试5. 公网远程访问本地Excalidraw5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 本文主要介绍如何在Ubuntu系统使用Docker部署开源白板工具Excal…...
PostgreSQL和MySQL的异同
0.前言 MySQL是一个关系数据库管理系统(DBMS),通过该系统,您可以将数据存储为包含行和列的二维表格。它是一个常用系统,支持许多 Web 应用程序、动态网站和嵌入式系统。PostgreSQL 是一个对象关系数据库管理系统&…...
有ai写文案的工具吗?分享5款好用的工具!
在数字化时代,人工智能(AI)已渗透到我们生活的方方面面,包括内容创作领域。AI写文案的软件以其高效、便捷的特点,正逐渐受到广大内容创作者、营销人员、甚至普通用户的青睐。本文将为您盘点几款热门的AI写文案软件&…...
docker+k8s相关面试题
dockerk8s k8s详细介绍docker的工作原理docker的组成docker与传统虚拟机的区别docker技术的三大核心概念centos镜像几个G,但是docker centos镜像才几百兆镜像的分层结构以及为什么要使用镜像的分层结构容器的copy-on-write特性,修改容器里面的内容会修改…...
力扣爆刷第101天之hot100五连刷91-95
力扣爆刷第101天之hot100五连刷91-95 文章目录 力扣爆刷第101天之hot100五连刷91-95一、62. 不同路径二、64. 最小路径和三、5. 最长回文子串四、1143. 最长公共子序列五、72. 编辑距离 一、62. 不同路径 题目链接:https://leetcode.cn/problems/unique-paths/desc…...
前端vue实现甘特图
1 什么是甘特图 甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。以提出者亨利L甘特先生的名字命名,是项目管理、生产排程、节点管理中非常常见的一个功能。 甘特图内在思想简单,即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的…...
SQLiteC/C++接口详细介绍之sqlite3类(十五)
返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(十四) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(十六) 47.sqlite3_set_authorizer 用法ÿ…...
每日三个JAVA经典面试题(十八)
1.volatile 关键字的作用 在Java中,volatile关键字用于声明变量,以确保该变量的更新对所有线程都是可见的,即当一个线程修改了一个volatile变量的值,这个新值对于其他线程来说是立即得知的。volatile关键字有两个主要作用&#x…...
RPC 和 序列化
RPC 1 RPC调用流程 1.1 clerk客户端调用远程服务 Clerk::PutAppend() raftServerRpcUtil::PutAppend() raftServerRpcUtil是client与kvserver通信的入口, 包含kvserver功能的一对一映射:Get/PutAppend,通过stub对象——raftKVRpcProctoc:…...
【原创】三十分钟实时数据可视化网站前后端教程 Scrapy + Django + React 保姆级教程向
这个本来是想做视频的,所以是以讲稿的形式写的。最后没做视频,但是觉得这篇文还是值得记录一下。真的要多记录,不然一些不常用的东西即使做过几个月又有点陌生了。 文章目录 爬虫 SCRAPYxpath 后端 DJANGO前端 REACT Hello大家好这里是小鱼&a…...
MySQL的备份
为什么要备份: 1.保证重要的数据不丢失 2.数据转移 MySQL数据库备份的方式: 1.直接拷贝物理文件 2.在可视化工具中手动导出 (1)在想要导出的表或者数据库中,右键,选择备份或导出 使用命令行导出 MyS…...
Linux 磁盘的一生
注意:实验环境都是使用VMware模拟 磁盘接口类型这里vm中是SCSI,扩展sata,ide(有时间可以看看或者磁盘的历史) 总结:磁盘从有到无—类似于建房子到可以住 ————————————————————————————————————…...
C#配置连接数据库字段
在Web.config文件中 添加如下配置 <!--连接数据库字段--><connectionStrings><add name"sql" connectionString"server.;uidsa;pwd8888;databaseArticleWebSite" /></connectionStrings>...
QCOM和其他常见芯片平台术语缩写
1 QCOM 1.1 General Qualcomm: Quality Communications ALSA DCP:ALSA由DAI、Codec、Platform三部分组成 ALSA TLV:Type-Length-Value Alternative Mode: 替代模式 ANC:Automatic Noise Canceller ASM: Anntena Switch Module AT:…...
css页面布局
CSS属性书写顺序(重点) 建议遵循以下顺序: 布局定位属性:display / position/ float / clear / visibility / overflow(建议display第一个写,毕竟关系到模式) 自身属性:width / height / margin / padding / border / background…...
6、Design Script之列表
Range 在DesignScript中,Range是从起点到终点的一系列数字,使用指定的步距(间距类型),并有以下的初始化方法: start..end..step; start..end..#amount; start..end..~approximate; Range可以是数字的,也可以是字母的。 字母范围因大小写而异。 开始,结束. .#数量范围(…...
Mysql数据库的多实例部署
mysql多实例部署 先进行软件下载 上传二进制格式的mysql软件包 [rootcjy ~]# ls anaconda-ks.cfg mysql-8.0.35-linux-glibc2.28-x86_64.tar.xz配置用户和组并解压二进制程序至/usr/local下 创建用户和组 [rootcjy ~]# useradd -r -s /sbin/nologin -M mysql解压软件至/usr…...
陈巍:Sora大模型技术精要万字详解(上)——原理、关键技术、模型架构详解与应用
目录 收起 1 Sora的技术特点与原理 1.1 技术特点概述 1.2 时间长度与时序一致性 1.3 真实世界物理状态模拟 1.4 Sora原理 1.4.1扩散模型与单帧图像的生成 1.4.2 Transformer模型与连续视频语义的生成 1.4.3 从文本输入到视频生成 2 Sora的关键技术 2.1 传统文生图技…...
JS原型和原型链的理解
原型链图,图中Parent是构造函数,p1是通过Parent实例化出来的一个对象 前置知识 js中对象和函数的关系,函数其实是对象的一种 函数、构造函数的区别,任何函数都可以作为构造函数,但是并不能将任意函数叫做构造函数&…...
如何配置Oracle 19c审计清理_DBMS_AUDIT_MGMT自动清除策略
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL不生效的根本原因是清理策略未启用或配置错误,需先执行INIT_CLEANUP初始化并启用CLEANUP_OS_AUDIT_JOB调度作业,且统一审计必须指定AUDIT_TRAIL_UNIFIED类型。DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL 为什么总不生效根本原…...
揭秘Windows风扇控制神器:FanControl让你的电脑散热静如处子
揭秘Windows风扇控制神器:FanControl让你的电脑散热静如处子 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trend…...
火速报名 | 2026中国高校计算机大赛——大数据挑战赛,五星级巅峰对决,邀您问鼎!
在数据洪流奔涌、AI重塑未来的2026年,一场属于全球数据英才的顶级学术竞赛已拉开帷幕。2026中国高校计算机大赛——大数据挑战赛现已全面启动,诚邀您投身这场思维与算法的巅峰较量,在金融时序预测的浪潮中,展现您的智慧锋芒&#…...
为什么你的Copilot总在破坏ESLint规则?揭秘3层风格一致性断点——语法层、语义层、团队心智层
第一章:为什么你的Copilot总在破坏ESLint规则?揭秘3层风格一致性断点——语法层、语义层、团队心智层 2026奇点智能技术大会(https://ml-summit.org) Copilot 生成的代码常看似“正确”,却频繁触发 ESLint 报错——不是语法错误,…...
Fiji科学图像处理平台:生命科学研究者的必备工具完全指南
Fiji科学图像处理平台:生命科学研究者的必备工具完全指南 【免费下载链接】fiji A "batteries-included" distribution of ImageJ :battery: 项目地址: https://gitcode.com/gh_mirrors/fi/fiji Fiji是ImageJ的"电池全包"增强版科学图像…...
SITS2026现场算法验证数据全公开,72小时复现失败率高达68%,你还在盲目调参吗?
第一章:SITS2026现场算法验证数据全公开,72小时复现失败率高达68%,你还在盲目调参吗? 2026奇点智能技术大会(https://ml-summit.org) 来自SITS2026现场的137组原始验证数据集、完整训练日志及硬件环境指纹已向全球研究者开放。但…...
**发散创新:基于RBAC模型的权限管理系统在Python中的高效实现**在现代软件系统中,权限管理是保障数
发散创新:基于RBAC模型的权限管理系统在Python中的高效实现 在现代软件系统中,权限管理是保障数据安全和业务逻辑隔离的核心模块。传统的角色-权限绑定方式容易导致冗余与耦合,而**基于角色的访问控制(Role-Based Access Control,…...
uniapp 中利用本地存储实现tab页面间高效传参方案
1. 为什么tab页面传参是个难题? 第一次用uniapp开发带底部导航栏的应用时,我就被tab页面传参问题坑得不轻。明明在普通页面间用uni.navigateTo传参毫无压力,怎么到了tab页面就失效了呢?后来才发现,这和uniapp的页面生命…...
Vue3数字动画实战:用vue3-count-to打造数据大屏动态效果(附完整代码)
Vue3数字动画实战:用vue3-count-to打造数据大屏动态效果 数据可视化大屏已经成为企业展示核心指标的重要窗口,而动态数字效果则是其中最抓眼球的元素之一。想象一下,当领导带着客户参观时,大屏上的关键数据从0开始流畅增长到百万级…...
用AI写论文靠谱吗?目前市面上主流的论文生成软件哪个最实用?
在学术写作与毕业季的双重压力下,AI 论文生成工具已成为学生与科研群体的 “效率刚需”。但AI 写论文并非 “一键代写”,靠谱与否核心在于工具的学术适配度、降重与 AIGC 检测能力、文献真实性及本土化合规性。普通通用 AI 易出现参考文献造假、AI 率超标…...
