ChinaFAQ论坛

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

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

[复制链接]

75

主题

77

帖子

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。
: W4 g( O- B$ s: t
+ l# v' c7 P! m( e1.Login Items) V2 x$ k7 q, Y% K
打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。3 Z, ~6 R* c. G, }3 x$ ^" u  h

( s$ t3 \1 E. s
1 x: E/ m4 e' q1 t
: L, q, P% E$ p8 Y7 V2.StartupItems7 b; w' \8 R$ _; X( o1 N
StartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。9 i: @4 X2 F! L) |. q
% Q; e3 Y- _; @* O4 L% P; i* u
StartupItems一般存放在以下两个路径下:
: v4 k4 R: Q4 U( s7 K9 {3 m# c; k& @& m9 M* a7 ?* @. q
1)/System/Library/StartupItems
, i/ C% q, n$ j9 F/ b1 L1 v, b% {) z8 o; v: N* N- M
2)/Library/StartupItems, R2 M- @0 {- _8 g2 |
; U. Q9 A6 ?. C& C
大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。
" B( u: }/ a( T; q! K& i9 X( N  r# @
这里我们以/Library/StartupItems目录下的IcebergControlTower为例。/ ]# Y# a" A2 [; e1 p' ]

2 W+ x2 M* N& N' ~; Z% y+ h& U) s: [7 l+ ?& u: ]+ D
! D$ }3 M/ f" p" z( |
简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:
) m( l; C+ c( @4 s7 Q5 _( r  V' O9 l6 f2 k/ Q
1)可执行程序;
- t  G0 O  S# P8 {# r" f! w. c, H% ?; ~
2)包含依赖进程关系的plist文件(StartupParameters.plist)。- d/ O; ^8 I5 U; d4 A0 c/ `* Z
  c/ d4 L; k+ y  \) V2 i6 @  `1 F
2.1 The Property List
, u1 Q( |2 R$ L2.1.1 Plist的key值与含义7 e9 u8 e" [# A8 N, V
StartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。
$ @. q- R9 b! k* A; T- r
, V( V* t, q! F4 L5 w8 ]1 N% t
4 P  z8 T! |+ b! x8 U' R9 Q% j. w" h9 @5 g/ D
该plist需要获得root权限,包含了几个方面的内容:
! {+ p& Z& V! b# J8 E
* o8 Y" W- v% `& {& ]6 p3 \8 _# s$ ^" `1)Description;
, O! |# n. t& t: Z3 X  ~
4 k; s* t, h/ J; S3 A: p      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。/ S# ?/ K$ p4 f8 u* z6 x" r

3 q8 V# {! z* ?, Z2)Provides;# k+ T  ^+ r# ~( S
6 f+ D) @. ~/ ]) j$ H9 Y
      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。
4 O9 w: D/ o2 z" l
% }9 n6 m. ^1 s1 |: S      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。
! b: _+ q6 J8 n0 s- _% S
( c( r3 }7 t' a3)Uses;( N$ ]7 X, G$ \: X7 Z! d

1 F' I: f5 w/ v' ^- ?9 {* v     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。6 U! e8 n# v+ {& D1 G( ^2 S+ Y$ a: Y

; L7 r& g, G2 g  n# G% o1 ^4)OrderPreference;* J7 P1 g! t( B; i
/ z8 D+ U# e0 D6 a! f2 d+ q
     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。
; ?3 F- o- |& I6 i  x3 P! l
/ @5 Z- M: Y% M+ z3 |1 k5)Messages。( d; R9 z1 l* h- Q" t. t
  R6 l( ^) {" {$ U5 F
2.1.2 创建一个StartupParameters.plist文件
7 |" V9 S1 R4 D: E$ T, \$ A<?xml version="1.0" encoding="UTF-8"?>7 o5 S# R! b8 v' _4 K0 h) H4 W
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" + V- r6 ~% W8 b
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
; G0 q% }/ Z' M+ _& u6 B<plist version="1.0">
- r7 y2 U/ J  X" Q) o<dict>
3 v: v$ n, g3 y2 r  u$ G$ e    <key>Description</key>* _% @6 @+ y5 {* \/ _. R' t% X
        <string>Iceberg Control Tower Initilaization</string>" {/ Q. F% C1 j' ~; I& w
    <key>Provides</key>" Y0 F& X7 Z$ c% C( u, l
        <array>$ b6 x& x8 p2 S
            <string>Iceberg Control Tower</string>
. \$ v" P( t8 H        </array>2 ]; _! Z( \, }) V
     <key>Uses</key>2 [5 R+ l1 ~5 D( k
        <array>
! Y+ S* c1 G9 T# M" }5 a/ J9 i. r            <string>Disks</string>
+ {( A+ c7 ]8 ?9 I# B# U6 @; G        </array>
$ c! e! t* m: M: W    <key>OrderPreference</key>
- Y; _& Q9 @. L2 a5 x        <string>None</string>
: u& N0 k6 z# x8 \( c8 D. P8 L</dict>
6 k5 ^" a4 J3 e' V2 {% {# W) |/ i</plist>& }8 y* t( w/ \" l) Q
$ F' u* |" {( n( \1 {# ?6 C: p

- S( p, J7 S' P  T+ U9 B. O* R. o  H
2.2 The Executable File
4 p* \6 W0 L( K# ?  e# ^; w注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。9 f; w! f" O3 e- o! N; h

5 R0 X6 T# O, V, {: L0 ^      2)操作可执行文件需要获得root权限。
  }$ K) [- {: d8 `
$ ]! k! ^' B& U7 B9 s      3)可执行文件是一个shell脚本。, G! l+ \; Y; @8 u1 t/ F$ Y: i- \
0 ~% E3 ?6 M- [
打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:8 l& b" Q0 l5 z7 I( b/ d' b& m

5 z: J$ g/ }. Q/ ?
: A  W2 q4 O7 ~7 M. v. h( l% ]! c9 N; G% j1 |2 B& P
一般的可执行文件包含这样几个方面的内容:
9 [* e3 I3 J- O! C$ R
  `6 `! x, Q  C6 f1)./etc/rc.common
( n/ ]3 r; S5 D1 j! q$ z8 D
0 u" s6 o1 v) I# N6 bApple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。! E9 d7 [- G+ q1 j2 }( u

# L& s8 S" a- b2 x+ r: Y) \2)StartService(), StopService(), RestartService()
. J  E/ r2 w5 X; W$ D
6 l7 i0 i7 l4 R) w2 o4 Y0 t当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。
9 S# D% T* _" s0 d) V' `
. J. ~% |8 ?+ E) N  p参数含义:
, [- y, o! R5 C  m8 v. [* J2 B9 {; x$ V7 d
start:开机过程中开启服务;- z" D/ V# g+ ]/ c# R* u" q# l

# b( }% P+ U$ V6 \' E' r& I  f: Xstop:关机过程中停止服务;: v0 {: s# z) Z0 F. J
& M! ^8 g4 G% n7 o' R
restart:在特定条件下重启服务。1 C. f1 H+ \5 w3 b3 N: F3 K

! S" R0 Y4 [/ y3)RunService  “$1”
# j) B3 R; a; I* X( T! ~' c0 m! X, S6 ]) q+ R' w( ]. {% o/ n
执行传递给该脚本的第一个参数指定的服务。5 B! l% ^/ E4 b8 P( |; ?7 S4 s

& C; `$ h6 I1 a$ J% p9 @“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。# |/ q( Y7 G! D& p, R+ |
( }' `, S0 e; w0 {* D% @
3. Launchd Daemon2 U8 \7 h$ n! C" w9 Q* ?* |
launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。
7 L: @5 f+ P* U5 {, W, a7 X5 \( v. p; v! A$ T; `
采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。
/ B& l0 W  p2 w; V' k. D4 h, P' u4 B- w  |
3.1 plist文件格式及每个字段的含义:* n/ d1 j9 ^$ |; a  G) X! W" c5 R

) {# D& ]1 m9 I0 W" d
4 L: N: q, z# s; q+ B, y1)Label【required】+ e8 |4 \8 C, T6 n1 X. K

( I3 i* e5 ^1 T8 p  x该项服务的名称。
* H9 a4 [7 I+ p7 `& q( z4 D
  t  }4 T+ T1 i+ C" b' _2)OnDemand【optional】
4 Y0 q/ g' E8 u2 C  d# d, O. B0 T. Z) j0 m( }, q7 E- \9 r
10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。6 I8 t$ I. `7 S+ {4 M. G0 q& x

0 G4 ~" |4 E1 o+ ]# ~" B) f' T3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】
/ K( j% L7 d5 j- `, U& }
/ H+ f4 l* y8 h' v8 `指定可执行文件的路径。
& h4 L# s( D& j
% S1 s% G* M% r8 m" c# s4)RunAtLoad【optional】. Q( Z/ j. o# H. F8 ?
% C- L7 e( a2 P/ H3 R$ {7 J
标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。
1 N; ]7 F! \2 ]. B+ F1 m# p4 g
7 ?6 u- f% Z+ h- G  y" O1 t4 d& ]5)WorkingDirectory【optional】. ^+ V7 E) M8 M# U) N9 i/ P3 x
! c- C3 l5 D; x/ B
该key在开启可执行文件之前,指定当前工作目录的路径。
# X7 u8 Z1 M( k: E: e: `1 m, H/ Y& C+ N0 P; {
6)KeepAlive【optional】
- L5 [1 g; ?; m/ u( A6 W# o: }) J/ o! S: }2 t6 q
这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。0 v6 L* k, {: ?9 R+ `, t3 N5 B; A+ h7 ?
# _2 @% Q( D  k# N& V" e) w4 V: }
3.2 创建一个plist文件:5 N* _# F5 h& P. L2 @) l
<?xml version="1.0" encoding="UTF-8"?>8 l/ I2 X! Q% L  K7 U$ J
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
3 m0 T! s( O; z3 T! v: a( Y    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
7 o. B; @' l; g9 k/ L3 o<plist version="1.0">
8 [- h0 ~( s. ~" I7 b: Y- |<dict>0 Q# Z& U3 D8 H( r, I$ v' ?. F
    <key>Label</key>
) D! t/ ^2 `& i        <string>com.yourcompany.HSPA_USB_MODEM</string>+ D% A0 |' q. i
    <key>OnDemand</key>
5 S6 r$ ]4 `1 {+ `        <false/>
0 ~; U2 t6 M# G3 \! K! ]    <key>Program</key>
: T' K* g% P- I  |; R: g2 m8 X        <string>/Application/HSPA USB MODEM.app/Running</string>- a7 B( F* p9 i8 \1 T! p* s# M
    <key>RunAtLoad</key>, ?$ H4 j8 {5 b
        <true/>
- z  o! F- |8 y- j+ `" J2 I    <key>WorkingDirectory</key>
5 {8 ?. P( @& S# |$ V        <string>/Application/HSPA USB MODEM.app</string>. o0 n) H' U$ x/ T* j" y
</dict>( [( R* c) X. R
</plist>
( `2 W0 {! t/ t0 t: t4.三种方式的区别+ @; W7 Q( C% C$ j+ d0 b+ H% K# O
初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。9 g0 W4 \9 @$ C5 |' D4 \" Z9 X3 b
) L' [9 S9 s( k: n& }
总的来说,LoginItems 和StartupItems的区别较明显。  j( V7 F! {  g% `
* Z1 J) [2 _8 l' I/ b9 I! y

1 A# P% s+ `6 \# P7 ~& G对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。" x1 X3 {8 a+ m
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 12:49 , Processed in 0.105278 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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