ChinaFAQ论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1931|回复: 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。; W/ O, j* j* B- x( }
# r) [$ K5 G0 L  m+ u
1.Login Items8 t. G0 |2 |$ v4 E( B6 h7 j! _! L
打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。: |; \0 f3 {2 G# @5 |

0 f1 m: {) ]0 o& k9 ?1 b$ R. ?( g) z5 u
, b  G9 N$ w) C  O: G
2.StartupItems3 j  h" p, V( ^- B* V. J: a9 i+ z) U
StartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。! `  }1 j0 O( n7 s1 k( C) K
9 ]' J; y! b: j" M) m
StartupItems一般存放在以下两个路径下:- N+ r5 r: N/ c) {% Z. G
* ~/ V7 l2 p% g' c% y
1)/System/Library/StartupItems
& w) ?8 h4 \& f+ `: D# Y6 K0 C" P# Q' Z
2)/Library/StartupItems1 d+ Q. s. _" e& Y  D$ J

# j0 c( W0 v: K$ r大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。" j/ \  g$ J6 B

/ P8 Y9 q  e: P9 g; I# B5 K这里我们以/Library/StartupItems目录下的IcebergControlTower为例。3 s6 O$ a1 r  G& f

. m. }* F+ G1 d/ L+ r* |0 L' V! ~( V) ?8 K% ~

# Z+ s6 g8 H2 Y4 _: G  F简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:
- s1 ~( s: i2 W" ^$ k
8 a8 P: c7 {' E; D/ i7 _1)可执行程序;) F! P" e: Q4 }# s

7 o, x( ^3 V4 P2 }) L( i2)包含依赖进程关系的plist文件(StartupParameters.plist)。
) P1 N) B" E) ?6 U+ v
& ^% I# F# F% J2.1 The Property List% k: ^0 l, ^  k& Q  I3 ]
2.1.1 Plist的key值与含义  S# S3 d3 v+ h) _6 z- ~2 y6 n
StartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。6 b6 @# T" x0 u6 M( [) Z. ~

: j9 q& i0 J* T3 H3 b; Z" T' n+ _$ U7 C

4 T, d9 A' k3 I$ Z该plist需要获得root权限,包含了几个方面的内容:
) B4 [6 w# Y0 a# }' M0 W1 C% `7 j: ~8 B% i! A
1)Description;6 N9 i. g5 {7 ~

- X. F% _4 i: U; Z$ K+ C      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。
8 R; n( S& @" O) Q) P7 h0 ]9 {% W0 W$ Y# a8 B& J& M. l
2)Provides;0 Z* U3 _' B/ P5 @. S6 ~& y- D& ]8 G% p
7 s: V7 w% o7 M( m7 S* j- s4 b2 y
      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。# l. o" S5 ?( E) H2 e4 q
4 L) g9 t$ }. j' }
      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。
9 p. x$ s1 T! a- d9 T  I0 q
1 u& _2 H0 K/ g' B3)Uses;$ b+ C/ E: U4 `: J
6 `9 ^' B5 V2 R: s  n( f' c
     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。! i! Y8 T- T$ }5 c, Y$ B! G
4 `" V' n. l9 ^( J$ k0 ^& X
4)OrderPreference;( H! A- P1 i* M# O1 t8 J

* K% @0 a3 L6 Z( d" J     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。. q& s: Q) g* S# w# @% w2 S

$ y! M9 @( M% ]5)Messages。
2 }. ?' H& y9 y8 E) s
$ W2 S+ D2 s* c! H  z2.1.2 创建一个StartupParameters.plist文件" u2 L- Y( d. r& ~
<?xml version="1.0" encoding="UTF-8"?>
# {( e/ x0 ]! f1 i: j- l<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
/ s$ v0 g9 k, ]5 {* j, ?    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
' ~! ~" c8 _! h6 @5 |  g8 U<plist version="1.0">+ h$ c$ Y/ K- N: ]
<dict>
* L- B4 t6 V& C; z  N) X    <key>Description</key>
* e) e  S  V, Q+ h        <string>Iceberg Control Tower Initilaization</string>
& B% C5 P, H- Z- x    <key>Provides</key>) U4 E% L. ]" s6 h. `' \7 F5 a
        <array>
# M* h$ D7 Y+ T* t0 `' T! w- Y            <string>Iceberg Control Tower</string>* q+ X2 y' H! a% c% X
        </array>' V5 h" T& m! f3 j% h5 s
     <key>Uses</key>; u$ n" [5 X  U9 R6 A( t& ?
        <array>
. P* P" O1 A  z$ E9 H, b            <string>Disks</string>
) C% l7 o0 ^% x) t! M# }6 S- I. o- W        </array>( ~/ u+ p2 ^$ q. P
    <key>OrderPreference</key>
. G1 J  y! _2 n1 O5 T- F3 O        <string>None</string>
8 Y* O# B. q* u# G</dict>: r8 t$ j; _7 u% `( ~- J
</plist>9 ?9 `6 I3 L" c9 _: Q

/ z/ `: E, P% O+ d: o8 g9 ?; e  n' E
* X$ k- {3 C/ ?0 J4 ^$ F3 T: D5 L/ w( D; S& }# Z6 z; H8 d
2.2 The Executable File
  y4 d" D2 A1 Y注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。  U! }& A, H3 H+ T: @4 U

- G) Q+ a: H7 j      2)操作可执行文件需要获得root权限。
0 ^. @3 z" Q2 n1 g& D* g* D1 |& M7 B
      3)可执行文件是一个shell脚本。
% I$ J+ H: T0 X0 Z1 N! Q* r( t
* Z* X; |8 z- P. J: j) V打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:7 C* Z) U% h3 }% ~9 n3 j

+ p/ q/ G/ F+ E" O5 e
. j; X( C; s4 a1 [$ P
) r1 E5 d( Q7 p, y- E" e一般的可执行文件包含这样几个方面的内容:( W& t: {6 C5 \& A/ f% u8 s1 L

, \! C( o% @* @$ N8 V" g- u1)./etc/rc.common% |3 k5 h/ S, \

# G7 [0 n, z0 k  P8 b3 [. h$ nApple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。' E/ [5 ~( {# S) P  T: i
( M# V1 R! X: U5 k0 V: E* L
2)StartService(), StopService(), RestartService()
; y" A3 D2 N. g+ h. Z" x1 y
5 |, D9 B: Y% y" }+ \4 V9 d当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。5 ?0 f# s& f' k# ?  R  g/ ^9 ]

, A+ m# u$ s- d参数含义:
7 m4 D! W8 d2 [+ E; Y; c0 V8 I6 v. S; M2 V( v  _
start:开机过程中开启服务;, v8 T0 u2 Z, ]+ d: \2 K7 o8 u
# p) m2 m' o0 o5 w5 |; m; k9 ]
stop:关机过程中停止服务;) c& m9 T# [0 k$ u: M; [0 l
0 |; [2 W  b2 ~9 z) G
restart:在特定条件下重启服务。
. z3 {7 Y/ N  ^0 A' a0 C* p
+ i& [9 d$ k6 X6 p0 w5 o2 c4 K7 w3)RunService  “$1”
0 V7 ?+ c1 B5 N1 F0 m! S9 X6 G0 m: A8 R
& V! P% ~6 R, O2 `% r0 @6 `5 c执行传递给该脚本的第一个参数指定的服务。
4 ]3 P* i( H1 ~! M. [
* L: O* k" ~% ]“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。8 ?) K0 D( y; ^8 ]! M1 [: b& Y1 r2 c: L
; V) }1 \. i: p& Q& t7 B) C
3. Launchd Daemon
+ a! g" v. a- C: K4 j$ s( [launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。
* L( [" P# i+ X0 p) H
. B$ X+ @: C, C' H0 q采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。
4 j& g" T5 X9 P; b4 @+ G" E4 v" Z  T$ f1 S8 u
3.1 plist文件格式及每个字段的含义:
$ T# G9 b; y- k" r0 f3 _& G# ]+ u# @; v  r* k. F: g/ g! M5 K$ Y

: x  d$ e* L) k0 H- V9 ?1)Label【required】7 O* F. b9 `8 M# L0 |

3 \1 F" q3 T  p% `5 n. o该项服务的名称。4 a6 g! i+ m8 d% `$ D! Q. b

# e8 Y, g* K" c2)OnDemand【optional】5 Y! s3 ?2 c* M: x( M) Q

; ]% @$ X: d, f' F10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。" Z+ `* a1 x9 d$ M& L$ i! ?0 p) n/ N
# p/ S/ O" N4 z: ?
3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】
) }. f6 o0 b. y/ _1 x& P7 ^4 U& }1 j' p) Q
指定可执行文件的路径。
. R: y$ m  d$ v! q) N
$ X# g- X' W% [# q3 W) r4)RunAtLoad【optional】2 q  ?0 m8 h" p4 g1 n! v6 T

% n2 [% {" A1 C* k标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。. Y5 y! Q  X$ M: e3 E) D1 B7 E

) t  X$ M4 g9 J0 l5 U5)WorkingDirectory【optional】& B( O- J8 Z& R4 \
/ M8 R$ @7 U. t1 H5 T$ o
该key在开启可执行文件之前,指定当前工作目录的路径。
1 |# @' Y, ]+ f7 }! ~8 o
. ?' I, N, T# ^6)KeepAlive【optional】
0 I( S/ U$ l' P+ J; r8 B% j
, j; I" U5 [* T这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。
1 E9 L* D2 {* }1 T4 M" a4 p/ f) e4 ?" F/ F+ R
3.2 创建一个plist文件:- g) Y$ t" x; k
<?xml version="1.0" encoding="UTF-8"?>  k; _% X- i+ z% R# {
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
& B9 c0 d1 D4 N6 ?/ d    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
2 h+ I" K( T' Z* ^' r' h<plist version="1.0">9 P4 R; b% a5 @5 M
<dict>
8 w- t+ X9 \$ I3 \* W4 X$ g    <key>Label</key>. |3 Z' Z/ s0 n  M; y! T4 a7 [5 W
        <string>com.yourcompany.HSPA_USB_MODEM</string>2 v+ Z; t9 b8 A" o7 t/ `0 G
    <key>OnDemand</key>
' p" _- f$ v  m+ C& J$ I        <false/>
! ]6 w, D# D# t% N: g) B0 X4 X3 C    <key>Program</key>! K0 j6 _8 r$ Q' d0 n( {
        <string>/Application/HSPA USB MODEM.app/Running</string>
( P/ {2 t- t1 e& }+ M* t) o    <key>RunAtLoad</key>
) X$ Q1 W- U7 B$ z6 W4 I/ S        <true/>
, I, t! m: q: Y4 [2 ?5 [    <key>WorkingDirectory</key>) ^+ M. p+ Z- y
        <string>/Application/HSPA USB MODEM.app</string>
/ X5 T4 X! }) P9 L  |</dict>
# }) s* N% d) ]+ F</plist>
( q5 |2 u6 P, N4.三种方式的区别4 L' q* J6 @" T$ c
初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。
; I. B9 e3 N' M- z3 a
. D6 M0 b2 m4 g' F/ M7 d  f总的来说,LoginItems 和StartupItems的区别较明显。% L1 U( m  b/ ]- _+ F

8 Z; Y" i: U8 b$ x+ A
* R0 P6 l7 J/ O4 c& u, L对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。) r& h0 D" h( Y$ a' X! m
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-17 11:03 , Processed in 0.052069 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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