前言在维护JenkinsSlaveNode(这里指的是macOS构建机)的过程中,难免会遇到一些文件访问权限和进程持久化的问题。因此,要想解决这些问题,就需要了解Linux的文件访问权限(包括文件和目录,以下统称文件)以及什么是守护进程(macOSlaunchd)。那么,回到今天的文章,我们也将从Linux文件访问权限相关的常用命令入手,一步步带你了解其中的道理。一、Linux文件访问相关命令首先,我们需要建立的基础知识是,在Linux系统中,文件访问者的身份分为三类:文件所有者、某个用户,比如组到根文件属于哪个用户组,如staff、wheel等用户,不是以上两种。下面,让我们了解一下在查看和修改文件访问权限的过程中会用到的命令。1.1ls-l,ls-lals这个命令我想很多同学都知道,可以用来查看某个目录下有哪些文件,例如:wujingchang@wujingchangdeMacBook-Proant-design%lsAUTHORS.txtREADME-zh_CN。mdpackage-lock.jsonCHANGELOG.en-US.mdREADME.mdpackage.jsonCHANGELOG.zh-CN.mdSECURITY.mdrenovate.jsonCNAMEcomponentsscriptsCODE_OF_CONDUCT.mddocssiteLICENSEindex-style-only.jstestsREADME-ja_JP.md索引-用-locales.jstsconfig.jsonREADME-pt_BR.mdindex.jstsconfig.node.jsonREADME-sp_MX.mdjest-puppeteer.config.jstypingsREADME-uk_UA.mdnode_moduleswebpack.config.js和ls的-l选项即可用于查看文件所有者、组、读写权限以及文件大小等信息:wujingchang@wujingchangdeMacBook-Proant-design%ls-l-rw-r--r--1wujingchangstaff5083911912:50AUTHORS.txt-rw-r--r--1wujingchangstaff32012611912:50CHANGELOG.en-US.md-rw-r--r--1五井场员工33494911912:50CHANGELOG.zh-CN.md-rw-r--r--1五井场员工1611912:50CNAME-rw-r--r--1五井场员工325411911:39CODE_OF_CONDUCT.md-rw-r--r--1五井场员工109911911:39LICENSE-rw-r--r--1五井场员工1015511912:50README-ja_JP.md-rw-r--r--1wujingchangstaff990311911:39README-pt_BR.md-rw-r--r--1wujingchangstaff980111912:50README-sp_MX.md-rw-r--r--1wujingchangstaff1062311911:39README-uk_UA.md-rw-r--r--1wujingchangstaff959611911:39README-zh_CN.md#省略在几个目录下,如果还想隐藏文件信息,可以使用ls-la然后,在这里可以看到主要的9列,分别代表:读写权限信息、链接目录数和文件路径长度(比如此时/demo/test为2)、所有者、组、文件大小,创建月份,创建日期,创建时间,文件名,如AUTHORS.txt:#读写权限链接目录号和文件路径长度所有者组文件大小创建月日时间文件名-rw-r--r--1wujingchangstaff5083911912:50AUTHORS.txt显然,我们关注的是第一列(文件读写权限信息),由长度为10的字符组成:第一位表示一个文件或一个目录,比如一个文件是-,目录是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.2chmodchmod">chmod是changemode的缩写,意思是改变文件的权限,我们可以通过chmod+和要获取的权限r,w,x来改变具体的文件权限,比如chmod+w表示添加可写权限,否则-w表示去掉可写权限,同样是AUTHORS.txt文件,我们去掉原来的可读权限:wujingchang@wujingchangdeMacBook-Proant-design%chmod-rAUTHORS.txtneeds注意-r修改的是访问权限默认为owner,我们可以通过u-r(所有者)、g-r(组)、o-r(其他用户)取消指定的读取权限。那么,AUTHORS.txt文件的权限信息现在是:wujingchang@wujingchangdeMacBook-Proant-design%ls-lAUTHORS.txt--w-------1wujingchangstaff5083911912:50AUTHORS。txt可以看出原来的r已经去掉了。这时候如果尝试打开AUTHORS.txt,会提示:另外,除了可以用字符r、w、x来修饰外,我们还可以用数字来修饰(4是可读的,2可写,1为可执行),例如去掉AUTHORS.txt的读权限:wujingchang@wujingchangdeMacBook-Proant-design%chmod020AUTHORS.txt1.3chownchown">chown是changeownership的缩写,表示我们可以改变文件的访问权限,比如我们可以修改AUTHORS.txt文件的属主为root:wujingchang@wujingchangdeMacBook-Proant-design%sudochownrootAUTHORS.txt注意,由于root是超级用户,需要sudo.那么此时AUTHORS.txt的拥有者会变成root:wujingchang@wujingchangdeMacBook-Proant-design%ls-lAUTHORS.txt-rw-r--r--1rootstaff5083911912:50AUTHORS.txt,现在可以用openAUTHORS.txt打开吗?答案是可以的,因为wujingchang和root是同组staff,-rw-r--的第4到7r--r--表示是可读,不可写,不可执行,其他用户也是r--。所以,此时你仍然可以打开AUTHORS.txt文件,只是打开后是只读模式:那么,如果你想修改文件属主,还要修改文件所属组,可以使用chown时传递user:group修改方式:wujingchang@wujingchangdeMacBook-Proant-design%sudochownroot:wheelAUTHORS.txtwujingchang@wujingchangdeMacBook-Proant-design%ls-lsAUTHORS.txt104-rw-r--r--1rootwheel5083911912:50AUTHORS.txt然后是其他用户的可读权限,可以chmod修改:wujingchang@wujingchangdeMacBook-Proant-design%openAUTHORS.txtwujingchang@wujingchangdeMacBook-Proant-设计%sudochmodo-r作者。txtwujingchang@wujingchangdeMacBook-Proant-design%ls-lsAUTHORS.txt104-rw-r-----1daemonwheel5083911912:50AUTHORS.txtTheapplicationcannotbeopenedforanunexpectedreason,error=错误域=NSOSStatusErrorDomainCode=-5000"afpAccessDenied:操作访问权限不足"UserInfo={_LSLine=3863,LSErrorDict={Action=odoc;文档=("AUTHORS.txt");错误码="-5000";满的Paths=("/Users/wujingchang/Documents/repo/ant-design/AUTHORS.txt");},_LSFunction=_LSOpenStuffCallLocal}1.4chgrpchgrp">chgrp是changegroup的缩写,意思是我们可以改变文件所属的组也就是说,除了在使用chmod时指定用户组来修改组的访问权限外,我们还可以直接通过chgrp修改AUTHORS.txt文件的组:wujingchang@wujingchangdeMacBook-proant-design%sudochgrpwheelAUTHORS.txt2.launchd通常我们在注册连接JenkinsSlaveNode的时候,希望它常驻内存,在Windows机器上,我们可以通过Services来实现,在macOS上,我们可以通过launchdDaemon进程相关的能力来提供它,launchd是苹果公司创建的一个初始化和操作系统服务管理的守护进程,launchd中有两个主要的程序,launchd和launchctl,前者用于启动系统和运行服务,而后者是用来控制服务的。因此在macOS启动过程中会加载launchd,launchd会运行/etc/rc,根据需要扫描系统System、用户User下的脚本,以及全局的/Library/LaunchDaemons和/Library/LaunchAgents目录在plist上调用launchctl,然后launchd启动登录窗口。其中,LaunchDaemons和LaunchAgents位于不同的文件位置,执行的用户不同:用户运行的类型文件位置UserAgents~/Library/LaunchAgents当前登录用户GlobalAgents/Library/LaunchAgents当前登录用户GlobalDaemons/Library/LaunchDaemonsroot或者指定用户GlobalAgents/System/Library/LaunchAgents当前登录用户AystemDaemons/System/Library/LaunchDaemonsroot或者指定用户可以看到LaunchAgents只能用当前登录用户运行,而LaunchDaemons可以指定一个特定的user和requires请注意,只有LaunchAgents可以访问macOSGUI。如果我们希望通过launchd运行指定的程序(launchJob或Service,以下统称为launchJob),需要在上述文件目录下配置一个扩展名为.plist的XML文件,通常称为a列表文件。那么,我们来看看如何创建launchdJob?2.1launchdJob的创建用于创建launchdJob的Plist文件配置提供了很多Key-Values来实现指定的语句。这里我们看4个比较常用的Key:Label用来表示Daemon的名字,唯一标识ProgramArguments用来表示Daemon启动时需要执行的命令行相关的UserName用来表示用户谁启动守护进程。比如可以声明为wujingchangKeepAlive,表示Daemon是需要按需运行还是必须运行。那么,以连接JenkinsSlaveNode为例,需要我们在构建机(macOS机)上通过指定的Java命令与Jenkins服务器建立远程连接,如下所示:java-jaragent.jar-jnlpUrlhttp://xxxxxxx/jenkins-agent.jnlp-secretxxxxxxxx-workDirD:\jenkins因此,它的lauchd作业配置将是:
