ChinaFAQ论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1848|回复: 0

在Mac OS X中,有三种方式来实现启动项

[复制链接]

75

主题

76

帖子

422

积分

管理员

CEO

Rank: 9Rank: 9Rank: 9

积分
422
QQ
发表于 2020-4-2 22:48:17 | 显示全部楼层 |阅读模式
在Mac OS X中,有三种方式来实现启动项的配置:1)Login Items;2)StartupItems;3)launchd daemon。2 U  k% \$ ^& R. H5 m

; g2 b) H/ Y( w+ v( @( h; ^, F1.Login Items' l- p8 T# {2 k3 @* q; [/ k( U- ~
打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。: z/ ]( I; Z3 h; ~. R3 t' g( a' K
9 E0 ?5 o8 @8 Q7 z

8 D9 u6 F$ x+ O( g* T* }" q) L6 @  ^  ]/ U2 d1 X
2.StartupItems
6 z6 [9 O& C% C+ W7 r: FStartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。' o) N  R; C4 j; Y  N
4 i8 I* _9 _) W
StartupItems一般存放在以下两个路径下:
* S" Y! b9 l* y2 J) l$ t: X" B( G1 x) d
1)/System/Library/StartupItems4 a3 d. Z) |. W. y  ?3 [

7 r8 g( g% `6 C9 f- j' X2)/Library/StartupItems$ f6 k9 I" Y( `+ C7 v

; [2 C3 X# O. W3 j; L$ ?% T大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。
, b& g) s2 _$ O$ J& P. j& A5 G* h, z2 |! O/ U% t
这里我们以/Library/StartupItems目录下的IcebergControlTower为例。
7 _6 I: j. s0 G2 y. y5 M% `- d" n2 b. V( w1 v" _% Q$ M, V7 Z5 c

5 j; k: M! {4 ]1 H+ ^* ^
2 Y+ b" H: Z0 {/ l简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:
0 ^8 `( s" T1 ]6 ?$ l( T1 b* ?8 g8 l% q2 R' P8 p
1)可执行程序;
! m# r/ I4 t+ {0 f1 ?1 ^" K& m$ G  r" P
2)包含依赖进程关系的plist文件(StartupParameters.plist)。# d: J; E& s5 H2 N9 [

4 m8 b/ w- \7 I$ Z% J- S. F2.1 The Property List  `4 h) I0 {7 |, R; Z6 L1 N2 |4 n& A
2.1.1 Plist的key值与含义
2 X, |$ {% i! V' E3 kStartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。' K) y( R3 i5 w4 F3 Q
: \7 F' s* I1 D3 T5 _5 ~$ |' `

0 Z5 ]6 E" O4 J$ U) P: c6 D' v* |4 A' `
该plist需要获得root权限,包含了几个方面的内容:# _  ~0 D6 N" o
% s* C" D$ b8 x+ g! n; b: e
1)Description;6 |8 B1 Y. h: M
, G/ ]/ E  E4 Z# }
      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。
4 ?% j3 W* t- P4 [# N, O: \+ ~
4 p5 c  R; S5 w9 q) W4 H2)Provides;
; s  Q4 d# J* F0 |  Y" @4 ]& f% l: O% s
      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。
0 Q1 r. s0 K/ _% q1 y+ {( E7 X2 {
* C5 V8 L" W% `% I) D$ g      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。
3 v; e7 L% V  E$ }- D, U1 w0 @; N3 y& Q; B4 K, Y$ }  A% Q7 g6 d  Q' P
3)Uses;4 w6 w; [$ {" C, \% w) v

6 d/ Y1 q( ^" I  O     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。, S, Y+ w" ]" g7 a1 [

5 D1 f/ g: K- W" Y8 m/ J6 F" Y4)OrderPreference;* L+ o5 ~. z8 U+ P
3 T' J, s+ }/ p" P- n
     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。
0 q' J8 ]2 ~4 X; u; x! ]5 @8 y, R/ G+ T! Z1 d! W' q
5)Messages。
* S8 q1 g2 }6 G2 u) |
3 A. c# P' J8 I/ E8 F7 l2.1.2 创建一个StartupParameters.plist文件
3 y6 x. s7 `6 z% o' c" C( \3 t<?xml version="1.0" encoding="UTF-8"?>
. t. {" {! P" y$ N<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
. a: @) @& P; y    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">/ _6 I* x& W% q
<plist version="1.0">
4 J9 M0 n  u; }# k# F<dict>. H, w, p% y% y& K: Q, W
    <key>Description</key>, R4 |* p+ w, W- N& S
        <string>Iceberg Control Tower Initilaization</string># j. w, i" Q; r8 E- I
    <key>Provides</key>( }; F, i: F" K! g2 r
        <array>
( E3 Z; H. W8 M            <string>Iceberg Control Tower</string>
9 [4 W- x3 S+ t" g1 {" U  }% |        </array>
& m" k; C2 N. C6 V4 q9 H: u4 P     <key>Uses</key>+ Y3 ~+ K* m) D) C
        <array>* T: D  F  U- L6 J+ z& u! i$ N
            <string>Disks</string>1 c$ @  P0 `! @; N9 _$ k/ T9 g0 ?
        </array>
: c+ X  Z) O8 m. r    <key>OrderPreference</key>
: F# _0 s5 `/ m5 `$ ]0 Q        <string>None</string>6 y" |5 Z4 Q* ~# ?
</dict>
* Z6 t0 B* U1 \& s7 t# Q9 _</plist>
) M  S6 j( c7 U
: t9 L4 F) O; G' j3 N2 W- S5 R; H + T( k7 z0 R% O) E
/ K' ]( U- C+ V$ ]/ c/ {
2.2 The Executable File! e# N+ q/ `$ ~5 L) h6 F
注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。# V8 X" H. W( |: H9 |( \/ }8 D- w5 O
8 k6 W8 _" u* ^- U! [! F3 p( l- x5 G9 N
      2)操作可执行文件需要获得root权限。
6 u: o% Z* L! z# r! L. j% ]# y  q
" D$ d: n/ L5 p8 n# u. ^& j      3)可执行文件是一个shell脚本。
. f/ }0 y1 y4 t+ Z- O3 r$ p) {+ q! N: K, r6 h! f8 u
打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:
" u0 W, f0 L$ {
0 C2 o7 ?5 h. H, j" I, G$ I
9 y8 E+ x0 E2 |! A5 y  |" ?; `$ t( K$ T- ~
一般的可执行文件包含这样几个方面的内容:
* F1 u/ ~9 D( M8 R
7 a' P  P/ N  k/ W9 E8 |/ _" p7 s1)./etc/rc.common
/ {3 S& s- D% I4 p. N6 c, W: c3 m, _! M. R, V7 W- g
Apple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。, I- j6 ^  Y+ n8 ^% C/ A+ N

, l3 p& p! X+ n, a2)StartService(), StopService(), RestartService()
8 j! u# P0 K* \. v) |9 L: S" ~+ D) p' r
当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。
. ^" y: ~) B- o3 V1 `# }) S2 c6 |5 X2 F4 {' Z
参数含义:0 y$ V/ u5 x: t" k" ]7 R4 P4 u( l
* U, n" O) e, D$ O" F
start:开机过程中开启服务;) E  [8 X7 P( X$ S+ @( T

7 ^& Q4 _5 N2 C6 Gstop:关机过程中停止服务;- Y0 |. V2 u; B) ~: N- I; W9 k
* b0 }' s" Z& p$ v( X# `8 R
restart:在特定条件下重启服务。- o8 p; d* I- L: Y3 N2 b2 W
  A& `1 G/ E$ o3 Q
3)RunService  “$1”
$ z! t* O1 P/ Z+ }& `- g" d0 \
: W# X* {4 s/ J: {执行传递给该脚本的第一个参数指定的服务。$ k* C  F# i* L( \

% Y# S5 j2 p1 j- C" \) D9 i" u; z“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。3 q4 E% K# d7 u" `2 w8 P/ J" d6 u6 S" s
- q8 ]2 l2 C  f- z
3. Launchd Daemon5 O. a4 l  z1 T  l
launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。
: B" t' X2 O2 B. F2 c
0 E" K* C- v+ {4 A采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。+ S3 T. f% ~  ~9 M
& K! y* o/ @4 M$ b9 z& E
3.1 plist文件格式及每个字段的含义:
+ r8 E7 J! u+ u
/ @& N& E9 R1 b- F2 @1 e" G$ F0 g: _% A  i/ E. n  M
1)Label【required】" j) B. Q4 v: _1 S$ }6 Y4 j

$ `. t5 I! P! j. ~3 q2 D该项服务的名称。
! J- \* f6 h9 a2 {9 }6 U0 a1 n
0 g/ u8 ?& A4 H' u2 q2)OnDemand【optional】
* E- L4 s6 M# t' S( D% o7 ~4 a" M  N3 V: G
10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。. _0 l; L  u+ v1 ?) M$ k+ S3 M

* M# @! L8 b3 K; G7 q3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】( X8 @& J* N/ R

* X1 X* g& C+ K: Z指定可执行文件的路径。
% f, ~0 |* s$ W* q, f
% k& M9 Y4 _' d; }6 F; l4)RunAtLoad【optional】3 j# l% K  g+ W, U2 c

$ D4 c: d+ |5 s# m, _' ~7 I' F. S2 j标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。) B: @2 u/ ?" I/ W; j) [# P
0 @  X% w; M4 c) s% v3 P
5)WorkingDirectory【optional】  ~; W# H$ D7 _5 w5 k

: [8 b: P) k7 W" M# B该key在开启可执行文件之前,指定当前工作目录的路径。
( U8 U0 G! Z' f; j! S: J2 ~4 P/ O; I5 Q$ [( J3 {# j8 N
6)KeepAlive【optional】
% I% V1 Z3 X2 l* C; \( B
& e* f! N9 V: W: D3 w" D这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。
# w' N! K- u+ c6 U& h/ N  c. w6 _
3.2 创建一个plist文件:* o# k6 }& H! a
<?xml version="1.0" encoding="UTF-8"?>. C6 e1 Z7 E, }+ V- f) X% z/ I( D
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
+ n2 k  S& V3 a' R8 ]$ _    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
: Y- L/ r% x$ R2 _' a* j<plist version="1.0">  W  X+ A8 f  _
<dict>
1 Z( G5 N. A; w    <key>Label</key>
( f3 Q4 [! I9 y# i# |1 w5 y        <string>com.yourcompany.HSPA_USB_MODEM</string>
5 {- \' {' c, C) F2 y9 y    <key>OnDemand</key>, L. b; G+ Z8 o  w" r. Y
        <false/>, e% ]0 [/ D, h5 D  K4 q! @/ q
    <key>Program</key>' X* Z) s( n* E% L" s) y
        <string>/Application/HSPA USB MODEM.app/Running</string># k3 u; r/ S! B  K! ~" P
    <key>RunAtLoad</key>8 {5 c- \) l9 S1 N* `# b; x
        <true/>
& T" h% V. |( u" g    <key>WorkingDirectory</key>
* Q! M+ j/ D' L5 R2 @        <string>/Application/HSPA USB MODEM.app</string>
, b' T" i4 W7 B</dict>- z" y7 S( _/ g* f# m
</plist>' I! `: C* t, D, S3 ]
4.三种方式的区别" b$ H! Z- u* k1 M8 Y0 w( i( H
初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。" |; i. ?/ A& I6 h( E: t: {* T

5 X0 L! F% Z& }. N, s; a" o总的来说,LoginItems 和StartupItems的区别较明显。
  {) Q1 T+ C/ u: E# I! E' X9 Y! g( |. _

0 G7 O8 ]8 w& M8 W: c0 {; B. Z对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。2 z+ ^+ b9 K; ~# w% @8 V
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|ChinaFAQ论坛

GMT+8, 2025-7-2 08:06 , Processed in 0.048507 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表