前语

在保护 Jenkins Slave Node(这儿指 macOS 构建机)的进程,不行防止地是你会遇到一些文件拜访权限和进程常驻的问题。所以,假如要处理这些问题,就要求你了解 Linux 文件拜访权(包含文件和目录,以下总称文件)和什么是看护进程(macOS launchd)。

那么,回到今天本文,也将会从常用 Linux 文件拜访权相关指令开始,一步一步带你了解这些其中的所以然。

一、Linux 文件拜访权相关指令

首先,咱们需求树立的基础认知是在 Linux 体系中,文件的拜访者身份区分这 3 类:

  • 文件属主,某个用户,例如 root
  • 文件所属组,某个用户组,例如 staffwheel
  • 其他用户,不是上面 2 者

下面,咱们再来分别认识下在检查和修正文件拜访权进程会运用到的指令。

1.1 ls -l, ls -la

ls 这个指令,我想应该许多同学都知道,能够用于检查某个目录下有哪些文件,例如:

wujingchang@wujingchangdeMacBook-Pro ant-design % ls
AUTHORS.txt			README-zh_CN.md			package-lock.json
CHANGELOG.en-US.md		README.md			package.json
CHANGELOG.zh-CN.md		SECURITY.md			renovate.json
CNAME				components			scripts
CODE_OF_CONDUCT.md		docs				site
LICENSE				index-style-only.js		tests
README-ja_JP.md			index-with-locales.js		tsconfig.json
README-pt_BR.md			index.js			tsconfig.node.json
README-sp_MX.md			jest-puppeteer.config.js	typings
README-uk_UA.md			node_modules			webpack.config.js

ls-l Option 能够用于检查文件属主、所属组、读写权限和文件巨细等信息:

wujingchang@wujingchangdeMacBook-Pro ant-design % ls -l
-rw-r--r--     1 wujingchang  staff    50839 11  9 12:50 AUTHORS.txt
-rw-r--r--     1 wujingchang  staff   320126 11  9 12:50 CHANGELOG.en-US.md
-rw-r--r--     1 wujingchang  staff   334949 11  9 12:50 CHANGELOG.zh-CN.md
-rw-r--r--     1 wujingchang  staff       16 11  9 12:50 CNAME
-rw-r--r--     1 wujingchang  staff     3254 11  9 11:39 CODE_OF_CONDUCT.md
-rw-r--r--     1 wujingchang  staff     1099 11  9 11:39 LICENSE
-rw-r--r--     1 wujingchang  staff    10155 11  9 12:50 README-ja_JP.md
-rw-r--r--     1 wujingchang  staff     9903 11  9 11:39 README-pt_BR.md
-rw-r--r--     1 wujingchang  staff     9801 11  9 12:50 README-sp_MX.md
-rw-r--r--     1 wujingchang  staff    10623 11  9 11:39 README-uk_UA.md
-rw-r--r--     1 wujingchang  staff     9596 11  9 11:39 README-zh_CN.md
# 省掉若干目录

其中,假如当你还想隐藏文件的信息的时分则能够运用 ls -la。那么,能够看到这儿主要 9 列,分别表明的含义为:读写权限信息、链接目录数和文件路径长度(例如 /demo/test 此刻为 2)、属主、所属组、文件巨细、创立月份、创立日、创立时刻、文件称号,例如 AUTHORS.txt

# 读写权限    链接目录数和文件路径长度  属主          所属组   文件巨细 创立月 日  时刻   文件名
-rw-r--r--  1                      wujingchang  staff  50839   11    9  12:50 AUTHORS.txt

很显然,咱们关注的是榜首列(文件读写权限信息),而它则是由长度为 10 的字符组成:

  • 第 1 位 表明文件仍是目录,例如文件是 -、目录是 d 和链接目录是 l
  • 第 2~4 位表明属主的权限,其中 r 表明读(Read)权限,w 表明写(Write)权限,x 表明履行(execute)权限,- 则表明无权限
  • 第 5~7 位表明所属组的权限
  • 第 8 ~ 10 位表明其他用户的权限

例如,这儿 AUTHORS.txt 的读写权限信息 -rw-r--r-- 则表明:

  • - 普通文件
  • rw- 可读、可写、不行履行(因为是一个普通文件不是可履行程序)
  • r-- 可读、不行写、不行履行,也就是说同样是 staff 组的用户(除开 wujingchang)只能读这个文件不能写
  • r-- 同上

1.2 chmod

chmod 是 change mode 的缩写,表明改变文件的权限。咱们能够经过 chmod + 和要获取的权限 rwx 来更改详细的文件权限,例如 chmod +w 表明添加可写的权限,反之 -w 则表明移除可写的权限。

同样是 AUTHORS.txt 文件,咱们把本来的可读权限去掉:

wujingchang@wujingchangdeMacBook-Pro ant-design % chmod -r AUTHORS.txt

需求留意的是,-r 默许修正的是属主的拜访权限,咱们能够经过 u-r(属主)、g-r(所属组)、o-r(其他用户)的方法移除指定的读取权限。

那么,现在 AUTHORS.txt 文件的权限信息则是:

wujingchang@wujingchangdeMacBook-Pro ant-design % ls -l AUTHORS.txt
--w-------  1 wujingchang  staff  50839 11  9 12:50 AUTHORS.txt

能够看到原先的 r 都被移除了,此刻,假如测验翻开 open AUTHORS.txt,则会提示:

常用文件访问权相关命令,以及 macOS launchd

此外,除了运用字符 rwx 的方法修正,咱们还能够用数字的方法修正(4 可读,2 可写,1 可履行),例如同样是移除 AUTHORS.txt 的读权限:

wujingchang@wujingchangdeMacBook-Pro ant-design % chmod 020 AUTHORS.txt

1.3 chown

chown是 change ownership 的缩写,表明咱们能够更改文件的拜访权。例如,咱们能够修正 AUTHORS.txt 文件的属主为 root

wujingchang@wujingchangdeMacBook-Pro ant-design % sudo chown root AUTHORS.txt

留意因为 root 是超级用户,所以需求 sudo。然后,此刻 AUTHORS.txt 的属主则会变成 root

wujingchang@wujingchangdeMacBook-Pro ant-design % ls -l AUTHORS.txt
-rw-r--r--  1 root  staff  50839 11  9 12:50 AUTHORS.txt

那现在咱们能运用 open AUTHORS.txt 翻开吗?答案是能够,因为 wujingchangroot 属于同一个组 staff,而 -rw-r--r-- 的第 4~7 位 r-- 表明可读、不行写不行履行,而且其他用户也是 r--。所以,此刻仍然是能够翻开 AUTHORS.txt 文件,但是翻开后会处于只读的模式:

常用文件访问权相关命令,以及 macOS launchd

那么,假如希望在修正文件属主的同时也修正文件所属组,能够在运用 chown 的时分经过 user:group 的方法修正:

wujingchang@wujingchangdeMacBook-Pro ant-design % sudo chown root:wheel AUTHORS.txt
wujingchang@wujingchangdeMacBook-Pro ant-design % ls -ls AUTHORS.txt   
104 -rw-r--r--  1 root  wheel  50839 11  9 12:50 AUTHORS.txt

然后,则是其他用户的可读权限,这能够经过 chmod 修正:

wujingchang@wujingchangdeMacBook-Pro ant-design % open AUTHORS.txt
wujingchang@wujingchangdeMacBook-Pro ant-design % sudo chmod o-r AUTHORS.txt
wujingchang@wujingchangdeMacBook-Pro ant-design % ls -ls AUTHORS.txt
104 -rw-r-----  1 daemon  wheel  50839 11  9 12:50 AUTHORS.txt
The application cannot be opened for an unexpected reason, error=Error Domain=NSOSStatusErrorDomain Code=-5000 "afpAccessDenied: Insufficient access privileges for operation " UserInfo={_LSLine=3863, LSErrorDict={
    Action = odoc;
    Documents =     (
        "AUTHORS.txt"
    );
    ErrorCode = "-5000";
    FullPaths =     (
        "/Users/wujingchang/Documents/repo/ant-design/AUTHORS.txt"
    );
}, _LSFunction=_LSOpenStuffCallLocal}

1.4 chgrp

chgrp 是 change group 的缩写,表明咱们能够更改文件的所属组的拜访权。也就是说,除开运用 chmod 的时分指明用户组的方法修正所属组的拜访权,咱们还能够经过 chgrp 来直接修正 AUTHORS.txt 文件的所属组:

wujingchang@wujingchangdeMacBook-Pro ant-design % sudo chgrp wheel AUTHORS.txt

二、Launchd

一般,咱们在注册衔接 Jenkins Slave Node 的时分是希望它常驻在内存中。这在 Windows 机器上,咱们能够经过 Services 的方法完成。而在 macOS 上,咱们能够经过launchd 供给的看护进程相关的能力完成。

launchd 则是 Apple Inc 创立的一个初始化和操作体系服务管理看护进程。在 Launchd 中有 2 个主要的程序 launchd 和 launchctl,前者用于发动体系和运转服务,后者用于操控服务。

所以,在 macOS 发动进程,会加载 launchd,launchd 则会运转 /etc/rc,扫描体系 System、用户 User 下、大局的 /Library/LaunchDaemons 和 /Library/LaunchAgents 目录下的脚本,根据需求在 plist 上调用 launchctl,然后 launchd 发动登录窗口。

其中 LaunchDaemonsLaunchAgents 处于不同的文件方位所履行的用户有所不同:

类型 文件方位 运转的用户
User Agents ~/Library/LaunchAgents 当时登录用户
Global Agents /Library/LaunchAgents 当时登录用户
Global Daemons /Library/LaunchDaemons root 或许指定的用户
Global Agents /System/Library/LaunchAgents 当时登录用户
Aystem Daemons /System/Library/LaunchDaemons root 或许指定的用户

能够看到,LaunchAgents 是只能以当时的登录用户运转,而 LaunchDaemons 能够指定特定的用户,而且需求留意的是只要 LaunchAgents 能够拜访 macOS GUI 的。

假如,咱们希望经过 launchd 运转指定的程序(launch Job 或 Service,以下总称 launch Job),则需求在上述的文件目录下装备以 .plist 扩展名的 XML 文件,这一般也被称为 Plist 文件。那么,下面咱们来一起看下如何创立一个 launchd Job?

2.1 launchd Job 创立

用于创立 launchd Job 的 Plist 文件装备供给了许多 Key-Value 来完成指定的声明,这儿咱们来看 4 个比较常用的 Key:

  • Label 用于表明 Daemon 的称号,仅有标识
  • ProgramArguments 用于表明 Daemon 发动时需求履行的指令行相关
  • UserName 用于表明发动 Daemon 的用户,例如你能够声明为 wujingchang
  • KeepAlive 用于表明是否 Daemon 需求按需运转仍是必须运转

那么,以 Jenkins Slave Node 的衔接为例,它需求咱们在构建机器(macOS 机器)上经过指定的 Java 指令树立和 Jenkins 服务器的远程衔接,这看起来会是这样:

java -jar agent.jar -jnlpUrl http://xxxxxxx/jenkins-agent.jnlp -secret xxxxxxxx -workDir D:\jenkins

所以,它的 lauchd Job 的装备会是:

<?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.jenkins.slavenode</string>
		<key>ProgramArguments</key>
		<array>
      <string>java</string>
      <string>-jar</string>
      <string>-jnlpUrl</string>
      <string>http://xxxxxxx/jenkins-agent.jnlp</string>
      <string>-secret</string>
      <string>xxxxxxxx</string>
      <string>-workDir</string>
      <string>D:\jenkins</string>
    </array>
    <key>UserName</key>
    <string>wujingchang</string>
		<key>KeepAlive</key>
		<true/>
	</dict>
</plist>

而且,需求留意的是 launchd Job 的 Plist 文件需求按前面提及的 LaunchDaemons 的文件方位寄存(保证开机自启的行为),例如这儿的 wujingchang 是当时用户,那么就把 Plist 文件放到 ~/Library/LaunchDaemons 文件目录下。

2.2 launchctl 指令运用

在创立好 launchd Job 的 Plist 文件后,后续在机器开启的进程则会履行对应的 Job。那么,也就是说咱们刚创立的 launchd Job 需求等待下次开机才能运转。

所以,假如你新创立的 launchd Job 也需求马上运转,那么则能够运用 launchctl 供给的指令,常用的 launchctl 指令有:

  • launchctl load 加载发动 launchd Job
  • launchctl unload 卸载中止 launchd Job
  • launchctl list 检查已发动的拜访 lauchd Job 信息

那么,回到上面的比如,咱们能够运用 launchctl load 指令运转刚创立的 launch Job:

launchctl load ~/Library/LaunchDaemons/slavenode.plist

此外,咱们还能够经过 brew services 相关的指令来发动和中止 launchd Job,详细我们能够经过 brew services --help 了解,这儿不做展开。

结语

经过,了解文件拜访权修正和 launchd 相关的知识,能够让咱们在 Jenkins 排障的保护进程处理拜访权限更得心应手,防止因为知识盲区的存在导致问题迟迟不能处理或许处理的本钱较高的情况出现。而且,需求留意的是每个修正文件拜访权相关的指令(chmodchownchgrp)都支撑运用 -h Option 检查相关的介绍,例如 chown -h

wujingchang@wujingchangdeMacBook-Pro @ant-desgin % chown -h
usage: chown [-fhnvx] [-R [-H | -L | -P]] owner[:group] file ...
       chown [-fhnvx] [-R [-H | -L | -P]] :group file ...

最终,假如文中存在表达不当或过错的当地,欢迎各位同学提 Issue ~

点赞

经过阅览本篇文章,假如有收成的话,能够点个赞,这将会成为我继续分享的动力,感谢~

我是五柳,喜欢立异、捣鼓源码,专注于源码(Vue 3、Vite)、前端工程化、跨端等技术学习和分享,欢迎关注我的微信公众号 Code center 或 GitHub