|
在Mac OS X中,有三种方式来实现启动项的配置:1)Login Items;2)StartupItems;3)launchd daemon。
$ \0 u$ H( n( B: K/ i, i) |0 G6 ]! X. T- e8 b( Z$ {
1.Login Items
( c; z: U& h& F" d打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。' ?! u( T+ `: B: D3 I2 @" X
$ q' B$ Y0 M5 x; h& Y3 I
+ G7 ], ~: N# S, A1 v$ u( k! o! V1 G3 ? b
2.StartupItems, V) Y0 l! X5 \2 j# w8 I1 ^; _
StartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。
$ ^+ Z! E U( Q2 h, P" V
/ C$ f' N& m) q1 \StartupItems一般存放在以下两个路径下:
; I& y) [% b# v5 p# [! v+ }. H
- ?' t1 g, |& a5 ?: r1)/System/Library/StartupItems# F. q+ E& l5 `* j; s
* E( U: T6 A' _5 W0 G+ g% Z
2)/Library/StartupItems
. X( i/ X7 Q9 t s
6 T5 I" ?8 B" _2 J大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。
5 H P+ w6 M J' _
3 \6 L; l' x1 T4 U6 e5 } R* ?这里我们以/Library/StartupItems目录下的IcebergControlTower为例。5 F& G+ {" w: I d; T, L7 x$ ]/ F- I
, G) @; I, G: ]9 ^( j& t
4 y3 H$ h7 O+ H0 R) K* g" G% I7 s6 ^1 W2 V8 B! r% Z
简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:" ?( N. |9 s$ J' `: {* l9 p
" |# g6 Q7 q' ^
1)可执行程序; ^; n* F6 q7 A7 Q/ n% @
2 @6 }6 t2 _ I* w/ _. ^2)包含依赖进程关系的plist文件(StartupParameters.plist)。+ `' y% _; X1 W/ d5 P8 X7 J+ E
8 n4 B7 j. {* Y7 v8 ~
2.1 The Property List
: o/ O2 A( @ Z( F% X' V7 S$ I) |2.1.1 Plist的key值与含义/ F; R1 T' n3 j9 n5 `/ \# g1 j( l( Y
StartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。0 v5 n- h2 s& w# t
# H8 a' O d( J4 U
+ ^: s% ?/ ^# E6 l
) G2 C! C) c8 a" x- v% L0 H) b该plist需要获得root权限,包含了几个方面的内容:
& `, U/ Z Z+ B7 t1 U
/ m# ^- V- W$ S, _7 g8 S1)Description;
4 H* ~- s/ b) t# F$ M, M% Z# L
9 h! W, @1 O0 D7 r 对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。
- P% ? Q5 ?; G4 A6 E, e1 L0 w, C7 X
2)Provides;% w, A0 t6 Q2 {1 b) v9 @
5 h) f, W" |# E" B
指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。. x# o* Z( A M. e( l# O( A2 |
& J; K! y: _) j* o6 G
Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。
- z2 V2 a* g2 Z% I: W4 ]
' J9 F: ~) [; V) O3)Uses;
! e- [" Q) }7 G
) w4 f8 v% J4 m! @( {+ n- Q 指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。
/ t5 \" b+ q$ T9 M8 _/ x+ Z
_ j1 H5 w, r. b2 N4)OrderPreference;% P6 e; F2 q% e5 O
& w- `# @( F2 V( [
指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。
' o6 T2 y' [; `/ R3 n
# X$ m+ E, S3 ]& m6 S3 D5)Messages。$ h* B9 V) W, h: i+ Y0 Y. X
' g! g0 @* k, ~3 X
2.1.2 创建一个StartupParameters.plist文件
% J G! Z* N. G" P6 F<?xml version="1.0" encoding="UTF-8"?>; c ]* s: r! B$ _, j# ]
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
* Q3 i( i6 `. H5 ? "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
7 h, ^) B& m: k) Z9 R) A% v6 ]<plist version="1.0">( {0 V2 R# ]1 t3 a2 Y
<dict>
7 e8 P5 S0 H* {9 w% B <key>Description</key>
6 s( k6 f# x6 u e9 e+ R+ C <string>Iceberg Control Tower Initilaization</string>: I+ a/ ^* G9 V* P
<key>Provides</key>! n4 y' V" \/ H4 X$ L
<array>
- Z o, t( u/ {$ F0 k <string>Iceberg Control Tower</string>: H8 v( R! j B) A6 D) H5 C
</array>, B8 l2 { B# i
<key>Uses</key>
: [) F4 ?1 R- u, P <array>
% a3 w W* X: z1 ? D9 U/ M. ]; J <string>Disks</string>
% Y" u, S* V8 k, M6 \( l </array>! z$ q! A2 J- b- ~
<key>OrderPreference</key>
, V. w. M9 x- A3 z' a+ Z" z1 |3 x <string>None</string>
; B E0 j" L3 U, d2 B</dict>7 o' M( D1 V/ A5 n* X
</plist>
& H0 F8 f; Q/ n) B( K" Y
# s6 g# [# S/ ? a/ N
8 W0 S/ `) W8 e+ f, R- D1 H" p! Z, r2 M' f
2.2 The Executable File
7 @4 P8 V6 f* [2 P; F* k$ K注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。
; A: }/ q( P# g; t6 E
+ _. h' V1 A# x: F, C 2)操作可执行文件需要获得root权限。
6 c% S ~1 x6 ~9 R4 m' g/ E6 U" a7 O, ?9 q- P
3)可执行文件是一个shell脚本。
7 k7 G- z6 `$ g; ]7 p' O" F6 y4 N$ K) b/ A+ o: _
打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:6 p, J4 T8 d' o. S. n
' K: r8 r5 {% Z% Y" Z( f. Q( ]" ~
1 c! l$ K2 x' z5 ?
: W- K8 h( h# ]+ E) M* k6 g一般的可执行文件包含这样几个方面的内容:7 t# R# }6 j+ m/ U* `$ D5 b4 r
5 M1 e6 t% w6 S- G1)./etc/rc.common, G, p9 s0 x8 O) _: N
$ V: R) u8 k# P/ c( p* M# ~9 E
Apple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。6 |* G, N& o2 u) h
, B4 i& n( E% Y
2)StartService(), StopService(), RestartService()) r9 |" V/ P1 H) v8 N
9 W# ^1 y. k2 i3 x! C; {5 r8 Y. C
当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。; X- ~% U! @. [- {& [
9 a8 C4 H9 h1 g2 C
参数含义:
8 ~ l& K3 c6 s3 N( ]* P. C! O0 b! @7 F3 ^$ N2 F
start:开机过程中开启服务;6 T2 U2 o# b% j
5 P8 S. I4 n0 C7 f. O9 ~stop:关机过程中停止服务;& b Z$ p; M" \( p6 l* @
2 B0 W" L5 Z( t/ d+ _
restart:在特定条件下重启服务。
. v) O$ d6 J0 q! N8 y! L
5 b( R3 p( T7 a5 d3)RunService “$1”! p2 u, ?) X$ H( T. V0 E
- {7 Y4 A( W! Q; b9 H. A
执行传递给该脚本的第一个参数指定的服务。 U8 h# o2 M# L/ T
( u% I/ \# @$ W X1 v. W a# y
“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。) I" h: {9 x) f/ v# Z9 Z* S& a" V
g- Q- J' A( a- l- B6 l6 @
3. Launchd Daemon. O6 i7 b4 J1 G5 u( {
launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。+ x. l9 u4 _% ]4 i! Q/ S! B
+ f' W0 H5 u+ ^$ ]) ?* l- x/ D
采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。& _- P; ]9 Q# h5 E% _, \" h
; m0 C- T! g4 L' Q4 R5 O& \5 m
3.1 plist文件格式及每个字段的含义:7 S0 c4 E* {3 f; f
" r# u5 |" a P) K
# d: [( U0 K6 N2 }
1)Label【required】
, z2 B. `2 `, X, L+ p+ [7 X5 N* ~8 U1 [/ ~2 M0 }, h/ F; z
该项服务的名称。
& D( v9 M1 _9 W/ w) e
( w6 I+ G( M/ g2 r3 |/ m2)OnDemand【optional】
7 Z! O+ C5 f6 P% M- {8 U% H
7 P8 h1 O2 { f# }/ E$ |# \10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。
! z2 `2 U( f" W; R7 b W# K, i- Z
3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】8 F1 }, x1 E5 o$ y
7 N4 h* c. W" N" q. K$ }
指定可执行文件的路径。
6 G) b8 Q# v; P, I% g1 a R% ^8 R5 U G' d9 c) v; _% `
4)RunAtLoad【optional】
1 p2 i. f! h% w% s, U
1 m" C- i1 j& @标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。
$ E i5 R( {' q" d+ \6 O# e+ z* {
. Y9 g5 B; D. z u8 e i% B5)WorkingDirectory【optional】! |3 b& N; k1 p, |( L* M2 c
& A5 L* P# o9 i8 s5 \7 B* l该key在开启可执行文件之前,指定当前工作目录的路径。
( c9 ]& v: P! A1 X+ i6 ~
$ Q3 ]% {' i; n( x+ t4 t5 m% {6)KeepAlive【optional】
/ }0 N7 W! E6 L' {0 n, [% d6 Q% B
, v1 R# } w. G这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。; B! J0 m2 @, l+ ?( u# v
% f! `+ H: B5 Q% O! }0 t3.2 创建一个plist文件:- Y8 c, w& P0 G% G; i
<?xml version="1.0" encoding="UTF-8"?>
' P) ^- V9 ?+ p& o, I<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
. C8 L# v' R9 Z3 a. x5 p" u "http://www.apple.com/DTDs/PropertyList-1.0.dtd">8 v# P' c/ a6 j1 t/ ^
<plist version="1.0">
4 F' y6 n" u" L% V<dict>
, |" ?' y2 z: C3 ? <key>Label</key>+ l/ r7 r8 k/ z' B; b; I- _9 g
<string>com.yourcompany.HSPA_USB_MODEM</string>
2 n* l$ f" k6 [2 e <key>OnDemand</key>
6 p5 p' ]% {. l$ @, Z <false/>
3 E, q7 C2 r; i* h% A <key>Program</key>
" F" X) ?" O( R% l% @ @, I <string>/Application/HSPA USB MODEM.app/Running</string>
% m" ~$ m: M% b) p <key>RunAtLoad</key>
6 g2 x0 H6 e: { <true/>$ Q' h: x& I/ I. w* G( n
<key>WorkingDirectory</key>; h* Y6 H0 G2 s' G5 i
<string>/Application/HSPA USB MODEM.app</string>
( g1 t5 r7 Q6 I( z7 F$ |</dict>
6 c% a( _- N. z4 n</plist>
3 o1 L% H4 e m+ G7 U3 ^4.三种方式的区别8 Q# e) g( n2 C7 g' K
初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。3 C5 k3 a- i4 t. `* a2 `5 @1 e
3 o- ?' W5 n# B/ }
总的来说,LoginItems 和StartupItems的区别较明显。' ?- k4 a5 O: y4 ]
7 S3 ]/ ?7 [! i! J9 j8 {4 I7 f& |7 g
n4 s0 W" V: L8 y; M
对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。8 F7 O/ Q8 b, k5 A
|
|