|
在Mac OS X中,有三种方式来实现启动项的配置:1)Login Items;2)StartupItems;3)launchd daemon。
1 \9 @0 B. @4 O9 A+ w& P y% [3 @* p% `
1.Login Items( h! R# `; h) ~8 J, ]
打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。. c& K% T5 {" m) x- a; O
! ?) R3 e2 j% J7 G% _6 m& [5 k+ C3 p) G
8 s. p* x& y0 }2.StartupItems) \. y- n. K. c/ p* ]
StartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。
1 V* v0 O, r1 d
9 T' @! a2 H5 V$ ?$ @StartupItems一般存放在以下两个路径下:) i# Q. T3 G6 y6 D7 J0 W; V
1 D s, ^8 Z- z) _' D1)/System/Library/StartupItems* ]0 t! }$ g9 t2 i+ ]
/ L$ P' i8 E8 U# a2)/Library/StartupItems
# ] J6 O: T- G$ o2 N
* T8 s' z) f# h8 e" h# b# o大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。+ p! `/ ~. a, [* F, e5 s/ |
e0 l6 ~4 l; g! R. [5 D. a" \" o这里我们以/Library/StartupItems目录下的IcebergControlTower为例。( u$ g7 Y& Y, v. m2 }
5 t' y2 y+ j" \+ N5 T; H
! _4 b; I( p S$ B
6 f" u0 N+ V) Y( k) M* R/ G1 N# V( {简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:
# p2 c. ]5 M; L- r
. l' E. M' D& d: Q1)可执行程序;
$ A0 m \* x" I
8 H e% V$ T/ F5 k' k0 [& M2)包含依赖进程关系的plist文件(StartupParameters.plist)。( V/ W" v2 R R4 U& P: W, u- j
7 L; V& n7 ^) }" M4 O
2.1 The Property List# s# h7 x- O* `( |" V
2.1.1 Plist的key值与含义$ ?9 L& ?& v$ l) |0 `
StartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。3 n- \ \9 {4 {( m$ y
" A: ]2 s$ A! O' v" {, X0 ?% e5 X8 g1 ^0 p# _* n0 S7 V
1 l2 S1 [" [1 i6 i( Q% ^! Q该plist需要获得root权限,包含了几个方面的内容:
- M6 O+ N2 T+ S+ r2 r; W, U' w% L/ y" W" x$ v
1)Description;# u! p# \6 _; M$ f/ I/ h
# b! ]+ `8 R9 u, P. R8 b1 z
对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。
0 H* W( V/ C' u0 o( w; J A7 Y0 s% [3 T, N% x
2)Provides;. i1 N, j( j& ?( W2 o. p
f# f" r" n8 T R
指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。$ ?6 e4 n+ P) I6 I c5 {% a
/ }1 y5 E8 z( x) u
Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。" B1 I/ M; _4 c" W* g/ n6 ~# Q9 F
- \, p0 w% D% {, R1 [5 ~; c3 ~3)Uses;
) ^9 ]; j) u# V' i$ p9 ^
5 l4 G8 |0 ~. _8 x/ J2 Z# A 指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。
( z1 t4 `& Z" \* I( Q
% J3 y4 W5 l/ c6 B* V4)OrderPreference;
* q% I" ?9 Y, v* b& }% s$ O H( L9 X0 L& u
指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。
- u8 q7 e& Y9 F) v$ S
6 @; R F" s- O5)Messages。 J7 j* Q9 m' m
8 @# m. e8 P) q. f7 v
2.1.2 创建一个StartupParameters.plist文件1 A) z8 Z" F A h! T, n
<?xml version="1.0" encoding="UTF-8"?>2 S u, D) @6 N. L. u' J$ f
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" ; e+ |: P% U2 E& R. J7 D/ R/ ?7 ~
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
; B# Q+ y# N) X( p7 P( g0 {<plist version="1.0">% e- k( Z' `1 F/ m1 X7 S- a7 X) L# y/ h
<dict>* B, z: k. v* h Q$ M# y
<key>Description</key>! Q W' C+ s4 m8 q: k7 P
<string>Iceberg Control Tower Initilaization</string> d3 M: q9 f1 S0 a8 s) @
<key>Provides</key>
: _5 f! I6 j% r' D. g+ s( d <array>
- V; R, t1 r" }+ n- D8 @ <string>Iceberg Control Tower</string>
5 B" b* `+ [/ U* L* Z1 U6 f0 C </array>% r3 n5 y4 H' f1 p
<key>Uses</key># m/ d' J o1 N* O4 ~
<array>
+ [' e _. X3 X; u' l <string>Disks</string>' n1 a4 r* c- ]# g1 Q# Z- n- x
</array>7 ~1 J- M7 D* f% t4 D
<key>OrderPreference</key>
$ ?+ D+ v3 h, \ <string>None</string>
! c! s+ A) ^& J" b$ ?</dict>
* b8 K: v) c5 N7 u6 Z</plist>
* U6 e! \# X( ~7 M* B7 v7 ^3 e( E5 _
; I1 K( ?/ y" u# a& s; U
! B k7 C3 D y4 |3 ^6 h$ _2.2 The Executable File
, k, L: S1 I+ c* w6 p, A6 n注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。
% U% \) L5 \& H' S* |; j4 Y: T# s* p9 [" e; }/ c+ T7 N# G
2)操作可执行文件需要获得root权限。 k% @9 c& D% |! R" U; Y1 E8 e
$ a. k0 i" p( @+ o8 D. J) i 3)可执行文件是一个shell脚本。
, ~1 s3 z+ ?4 }; t7 ]8 W V' H
8 Y2 s) f+ n8 @2 A打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:
; }# l2 c( [* I, S% C% {2 g
& H% |' f1 x) z+ v4 |) x$ j2 p- u }: Y5 F" c! |
) M4 Z8 \8 P8 k& O% e3 n" v一般的可执行文件包含这样几个方面的内容:* T5 j: K j4 [- s7 y, [
3 l* c) Q% a* [" R! `+ T, c' ^4 `1)./etc/rc.common* x& |% B1 s. k6 x+ G- c
/ i- R9 @% {6 s, w) M- tApple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。
7 C$ b- f" C3 ^' n: Y. V; T/ T8 u3 |/ W! o7 S
2)StartService(), StopService(), RestartService()! P7 c" v3 N5 d' G, D; X! \
' W% O O' Y' F' T当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。9 V$ C0 D3 _9 I, i3 V
. F. {! I4 ]" M' g+ t4 q
参数含义:
6 [$ E8 C. c# H0 M {
2 I' ^" j7 a/ \) e$ |start:开机过程中开启服务;
+ L0 l, {/ U3 z. R6 V }) e/ z! i
+ c1 b( ~% {. G% cstop:关机过程中停止服务;, V6 h2 [, J/ J/ y, r% l/ e
8 w( p4 d1 O5 K, R
restart:在特定条件下重启服务。: k/ I. ~- b0 f( }, h
" [1 x2 [: G k$ I3 E
3)RunService “$1”
+ K. R. p) L$ b8 q! ?7 K
8 N0 K5 g( D& u! v执行传递给该脚本的第一个参数指定的服务。- \' m2 y" p5 b% I, J
1 m3 f# ^8 ~! v& ]( L" J7 Y* n8 X“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。" ?4 {8 {# H5 s& s0 {
" \& [; p$ x- K1 J; F6 C
3. Launchd Daemon
( l% j# S" D Q$ R3 S, F6 G2 ?. ~: `launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。
& I' Y- ~* _8 B
% D8 a' `) J; R @采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。! o' g8 N/ v# n j0 B$ {
" P6 c. R2 `5 r. \; Y3.1 plist文件格式及每个字段的含义:+ A( T, A& l- w* e: I. d+ p
7 M% ~' K f, m& j1 ?6 Q3 Z/ o; R8 Y4 w+ a; b6 f# ^* B
1)Label【required】
- C' _% S' O" [9 Y5 R- @ L* d; i5 r+ z1 j6 i5 }
该项服务的名称。# n0 i3 I! A5 R- F: d: n2 I! s
6 A+ O! H1 M( }2)OnDemand【optional】
0 e3 v- |; X4 m {- r# G! ^% I3 G. L. P& S$ {
10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。- P% W- ^* x) g6 h
- [& O0 f1 h; U% |* Z9 A3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】+ p; G& p2 n! Z6 w& D
& d( ^+ ?' ]" }1 t) T) n
指定可执行文件的路径。# h+ l$ s8 w" W1 N
- }. U. K( F2 {$ J7 s1 W* T
4)RunAtLoad【optional】% u5 H) t8 ]: A/ k4 o
" ]1 i5 A0 ~1 U5 ~ ~3 d$ F标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。* K, I- y8 \; w, F2 X
7 F+ q' D7 M# H- G
5)WorkingDirectory【optional】
$ B! K% G! I' D) e5 U( h
& i: a/ i7 i0 B0 ]- R6 T) ~该key在开启可执行文件之前,指定当前工作目录的路径。
( ?( G# Z. T. d) Y) ]' h ~2 E7 L! P" ]7 s; U% u0 ~% Y
6)KeepAlive【optional】9 _2 I3 k. I H) B
% a D6 E2 j: z+ u这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。4 U8 J5 `1 v' a3 L
/ o- M! j2 P1 U- X/ W6 j3.2 创建一个plist文件:6 X" |/ a, R2 d/ M) N8 |' F
<?xml version="1.0" encoding="UTF-8"?>4 l0 t: @, A6 H/ F( Q4 p
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
2 Y# r* P" u. X, o% }$ N" Z3 G: L+ C "http://www.apple.com/DTDs/PropertyList-1.0.dtd">5 s/ }- I% ^& }5 e- q b" h$ A
<plist version="1.0">8 ~ t( Z5 m7 @4 d( q2 ?
<dict>
+ T* @0 i4 z+ {: M4 d <key>Label</key># P# M- `' p+ _2 G" y8 A
<string>com.yourcompany.HSPA_USB_MODEM</string>: W/ h4 Y; @ D0 j T0 d
<key>OnDemand</key>
. n r+ g+ H$ | p E <false/>
! o( e$ E" ]; u: {/ I$ _ <key>Program</key>
) g$ ^) b) Z8 |- {" [ <string>/Application/HSPA USB MODEM.app/Running</string>
9 r" M. \& z6 N8 E9 _( w <key>RunAtLoad</key>' W" |3 Q; Q* N/ o! ]* e
<true/>4 Y. _& x- h5 e* m1 |: \& \
<key>WorkingDirectory</key>
. G; U3 |7 \% j" K3 c <string>/Application/HSPA USB MODEM.app</string>
) V$ R- {2 h; Z</dict>
4 I' l* C1 s o# S& a/ D) W</plist>: _, g% P) V+ x% Y/ {. _1 r3 a
4.三种方式的区别5 ^7 \% |% e, z/ d# K6 d1 ?/ C
初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。
. I z t3 J4 g$ `8 ` t* V/ ?4 B& f5 v- z9 g K2 h' g
总的来说,LoginItems 和StartupItems的区别较明显。5 X# C- A. E! x& w' n+ L# W
^5 C1 u# y! M. Z$ v9 j! N+ i
& }6 N1 h' u/ G- b. f) w
对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。
8 O! h$ G) o% A8 w |
|