ChinaFAQ论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2188|回复: 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。
" C5 V) T$ [. F7 O- T! F/ [
4 Z' i& G0 t) z, T! }1 @1.Login Items
5 `- \5 b' D& I打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。
8 x$ ^+ j( k3 d9 L7 n1 y9 k
5 S! ?' d  M, x+ m& I4 W/ H5 \, e- Q6 ~' G( `  P6 ~

# C, `2 J- k" l" I: ^& I! D2.StartupItems
  P( A6 H- W3 L8 [StartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。
# C, C; g" a! l  l' d, N: I! ^, R& q8 v* n' m6 m9 U! m
StartupItems一般存放在以下两个路径下:7 M: d  l' l' y% t

( h# r9 W% d4 M1 Q% Z/ O: y+ s1)/System/Library/StartupItems  W' u9 x* I' _5 G! H1 Z* Y$ Q
; z& l) V" S2 ~) _% O- P
2)/Library/StartupItems; L' [. ?0 h5 c& \

  h9 q9 k6 n/ y# i大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。
/ j' ~1 d" a: [" w4 C
* n3 @3 X+ d2 p5 R( n这里我们以/Library/StartupItems目录下的IcebergControlTower为例。
' h: u/ u+ \: h: D5 `8 @9 o- W2 c8 U5 a3 i5 d# M7 X

9 c! k; s% N; b5 Q, w9 |
, [6 h- ?  j) [" t- t% s8 C- h+ A5 B简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:
3 r6 H  I: s( ?: D' l! I+ |0 ~. X2 d! W3 i& ]+ E/ L( Q
1)可执行程序;2 w8 b  b$ [3 z- K

: h. o$ f8 a6 m% e( K2)包含依赖进程关系的plist文件(StartupParameters.plist)。
$ n& @6 x4 k9 t- f: p6 m* s
. t1 h5 |" d# ~( k* |! z2.1 The Property List  P' z! e) y0 u, _+ V
2.1.1 Plist的key值与含义  D7 A1 Q: A  s1 [' p; A. G
StartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。
; j5 K5 d; T; \) l0 J
. Y0 l" \& O6 {' }, x
0 ]! {( ^6 O0 Y  m' b# s0 k9 z3 b# l$ ]& L# ?- y$ \5 Y
该plist需要获得root权限,包含了几个方面的内容:' c1 @, ]8 ]0 h# c2 j
" h: Q3 r8 _  c" L
1)Description;- A* G* j" A+ q9 w

6 R+ N  [0 d6 t9 n' g4 L% _) o      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。
& [  B/ |2 H1 B/ k0 P! l7 f  Z5 W1 j
2)Provides;5 u6 Q, j) o2 s& q: r/ i
! X# j# g! ~/ c. }' M
      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。, L3 ^2 V1 \& G% d

: D3 R: Q  Q) A; ]      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。# P  m& ?2 S. |) ?) N; _

* n  E0 l& [9 h) D3)Uses;
  K+ V; e: j! [& z2 X
  |) c! b8 e( z! A/ R+ ~& n     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。
" Y; @0 U% ?& r0 y7 f) Y- E5 ~. u
4)OrderPreference;
1 e  @: |# E5 D7 {2 a+ K5 H+ O- ]7 k
     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。
4 F+ p, t) z+ U& H2 N6 z2 O+ I' l
; A$ [6 _' x: ^& k$ t* y) k: z3 q5)Messages。4 h: g# s$ ?# ^2 P$ N+ I0 m' d% z4 U* Q
5 L$ o# S* j# n# n) J0 X
2.1.2 创建一个StartupParameters.plist文件
. S0 M* K* ]% S% j& `<?xml version="1.0" encoding="UTF-8"?># [" F5 e% }1 n! q- c/ y
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" * S! g* e, [# ]6 ^& K
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">4 [* ]. u. c1 Z
<plist version="1.0">
; t3 l  @6 X; J" }$ {8 ?7 U<dict>) w. i9 H2 u5 p! C4 y
    <key>Description</key>
8 K% C$ k0 t, K7 ~6 s# M0 g5 f  c8 L        <string>Iceberg Control Tower Initilaization</string>
: c. @* U6 v4 v& {* m8 E: n    <key>Provides</key>& |$ K7 v5 ]& J' y8 g6 W
        <array>
1 O5 {" y! g) b7 ?! N            <string>Iceberg Control Tower</string>
; O2 |4 e# H6 s( M% ~        </array>
! s% `' j5 `. `) {" O' A     <key>Uses</key>
" m# {" A7 [' v! A( j        <array>
  v( w9 a3 N( M2 E5 }            <string>Disks</string>" `/ Y  n: l; ]/ z9 j1 t
        </array>7 c) c' ]2 \* }/ f8 k( E, m
    <key>OrderPreference</key>
% @' c% n, }1 \: ?- g) A! J1 Z, X        <string>None</string>
9 f( H( d  j) W1 e4 n) M( A</dict>
/ w9 n7 M& Z" q" B, d& W</plist>) Q6 F9 e% w# p

6 D, q3 S, a# ~' O- Q' l5 J1 [  w + @0 ]% u0 a/ z/ L

7 B4 F9 T% z/ C& n; }. G2.2 The Executable File
0 _  b  \% _0 H注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。
. p) [8 }" p8 [" M
& R7 a3 A( g$ A& _" ~; d4 i      2)操作可执行文件需要获得root权限。! u8 D2 G& W: {8 G8 p) g

4 K3 j- J" C# l% J# x& q, C8 j' V      3)可执行文件是一个shell脚本。# }; N8 Z, q" n! P, b

- m) n6 B2 Z% @3 {& k% s  r打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:
: I, }7 a* n! _/ [' D2 p6 B, b/ C/ y1 O0 _
/ a7 B% c( ~* G4 l1 A1 C  W$ `

5 Y. {& w: @+ O3 B* W一般的可执行文件包含这样几个方面的内容:+ w! H5 f$ p5 t7 D# ]4 M  a
2 k4 z0 v: u- T" @4 V! n# s! o0 C6 S
1)./etc/rc.common
" ?0 P& r+ r& C: {7 [" |: ^, A8 o# w  `) ]8 _% E2 s; m
Apple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。
* i$ F: `$ S6 S
$ Q* v4 ]1 B9 V0 J9 H2)StartService(), StopService(), RestartService()
+ ?" i4 L" N0 {5 ^( |+ g7 V) J. @4 N$ w* Y9 i3 y8 M8 w# K2 P
当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。
8 X2 m% S9 b4 C( r5 L5 \9 \% A1 W1 {9 K/ X0 {& \! J+ H
参数含义:, {+ |# Q( V% {! O, X

- I/ ^( K& L+ f( N, m1 }start:开机过程中开启服务;( n8 m" ]* Q; e/ [" H2 [9 i1 Y) r
- ?* g0 O3 l3 b7 e  w% V! t7 G
stop:关机过程中停止服务;; x1 q4 S5 v) x% v$ g# V; l) |

. P6 n: O( ]- C$ x. U# N7 Orestart:在特定条件下重启服务。+ ^( H4 W; W& C. n1 f. C8 y
0 z9 T' c+ w0 H6 I5 d- K( H% h
3)RunService  “$1”8 A5 C4 Z/ W  m

0 t/ Y& O/ M# @& T2 A- G执行传递给该脚本的第一个参数指定的服务。
- J9 b9 S+ l# {1 u" k) [
' `, _- u" M$ I. ~“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。
* j  G* H5 _: o7 u
/ s2 _$ _4 Z9 k* d3 ?3. Launchd Daemon
" G4 E4 w7 V$ q6 W5 vlaunchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。
+ u. ~& O; K# O8 ?0 i3 [6 w6 _. |/ @
4 O5 i5 \( ~; G; z& t& `采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。
( ~3 N& T# N* B0 @0 t: b; C8 ~0 Z- ^' O% N
3.1 plist文件格式及每个字段的含义:
8 V' f, P9 V% D# D; i
9 E+ O8 D6 r: F. {) \9 q4 G% k' ^# f" V" m+ M1 i
1)Label【required】& ~) b* e: {0 N9 n! c. R1 ~
/ ?) \1 R$ J5 h; z' ]9 O9 `2 d' F/ _
该项服务的名称。
4 z0 X# B9 C3 d4 @' Q* ~3 l) v. n) v+ N- w  g* x# C
2)OnDemand【optional】4 |6 \' S4 ?& r- }! f+ D. @) x
& b! b3 K4 _9 g7 Y/ ]5 V7 f
10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。
3 t4 k8 \& x+ L4 O2 r/ H4 n4 \2 H4 C
. ~: A) d& [5 a) l5 n% o7 X4 F3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】
2 I  r1 M/ [5 Z- N6 s3 D5 ]& i5 y* @$ L( k
指定可执行文件的路径。
; _4 q" |/ E7 n# x" E$ V( C2 Q
5 O6 P8 P  N" S: ^$ U4)RunAtLoad【optional】
! m1 `3 M6 J( R" l8 c/ J% o" c1 v7 y6 }
标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。
1 `9 ~$ Z3 k! D, J7 T  y
+ S+ z0 v* h% `$ v4 o) x5)WorkingDirectory【optional】0 U6 j2 }; w8 l- L
  i1 p5 \8 ?. y# C  \& c1 q, l& V
该key在开启可执行文件之前,指定当前工作目录的路径。
. ^& w! g4 H: a9 Q1 ~
) ~! v4 B) K* ]) I2 [8 a6 y; a. ?4 z6)KeepAlive【optional】
6 J# r3 s4 M6 w1 m# u0 B! x! U9 B) K0 P8 ]; p; R2 _/ ^( h
这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。
+ o: V" {. M% c* }$ W' _
4 H5 t4 t9 P! ^  J0 O% i% |3.2 创建一个plist文件:) |: g8 b0 w& d. [+ r6 U0 E5 {% P
<?xml version="1.0" encoding="UTF-8"?>
: e0 a( r" f1 Z3 x  _% k7 X$ |<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" 6 D& ?) h" V1 ^
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">) t3 P. G, |6 t, L3 O
<plist version="1.0">
! e) p+ W  {- {<dict>" \) ^+ o+ n1 n' Q0 T* ]
    <key>Label</key>/ y, s9 [) a3 O, D/ u- d
        <string>com.yourcompany.HSPA_USB_MODEM</string>
/ ]6 L( J( m0 h* Y    <key>OnDemand</key># {  b% N. @1 j3 W/ m  ?! [4 N
        <false/># j, q  J: w, `# j9 O) P% ]! [
    <key>Program</key>
$ Z6 d# ]2 d, G# d# ?        <string>/Application/HSPA USB MODEM.app/Running</string>
8 }- s" U9 Z0 R( X' W5 H    <key>RunAtLoad</key>( R; D% s* k, N. r4 m
        <true/>$ ]+ H4 @8 y2 z; I7 }, v
    <key>WorkingDirectory</key>* V$ C- x, q3 t
        <string>/Application/HSPA USB MODEM.app</string># [% a# a; l& ?' t2 T( X
</dict>
, f4 U# [1 [4 g; l  n. d</plist>
: |5 X) x/ a3 @! P; q* ]4.三种方式的区别- v) J6 d/ ?6 _* c3 u7 u
初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。
6 d9 a& A2 |2 X; ^" J! q- c$ Q
% o0 y; n% g7 E1 s/ R: E) U总的来说,LoginItems 和StartupItems的区别较明显。7 N# E7 V4 r( h" H$ q

5 L/ M1 h* B' T8 G
9 v( n+ c- M9 _7 o! o对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。
# E( X: i: H, C( R
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-31 15:17 , Processed in 0.050407 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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