ChinaFAQ论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1846|回复: 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。( O/ B! p* }, M, K

8 d/ {2 d7 r$ @+ `, M" e/ e+ e1.Login Items
( l2 D' V: ?7 s: V  q% _, [: D打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。
9 s, _' T3 ^% c+ T$ v. N& R- ~7 ?! F0 ]+ H
& W4 X* x7 {  z$ Y$ P
8 w1 r. Y* `; k( V  F& g1 y
2.StartupItems
) C, E' J. v0 J! NStartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。5 J( ^# f7 X  e; e) @* N
: @+ N7 F8 D3 ]2 y6 [
StartupItems一般存放在以下两个路径下:3 ]. e' n0 z, F

5 v; w+ t6 L* I! d8 ~. ~" x' i1)/System/Library/StartupItems
$ n' F% Y; z9 B, `  F' ?
$ U6 l- |3 s3 _" L4 j7 P& q6 Z$ [3 Z2)/Library/StartupItems- I) [, k9 n5 Z) {9 k/ d( F8 _* ?0 J

8 b' h- U0 `& J" b. {7 H大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。& S# ~5 g3 D9 \3 U1 ?+ X

$ n! ~! |' J2 h! g这里我们以/Library/StartupItems目录下的IcebergControlTower为例。
8 {# \( t# x/ J# B+ K# ?) e0 r8 V* h% y- U
' Z8 D: _/ w  D% C8 S  a- m

' W8 q) p  @/ _# \8 z简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:% u" `9 r2 D9 ~# G( M/ e4 H# _8 k+ C
1 T' U/ C- L( u6 Z2 [$ l3 o
1)可执行程序;7 X0 X7 w. s) s+ m. ~
) c4 M+ \% e6 O; _
2)包含依赖进程关系的plist文件(StartupParameters.plist)。
, c3 y) k; B- o2 l
* Q1 M1 {7 e8 D$ L8 }2.1 The Property List% M+ d/ y' m5 {% y6 d( ^6 p) J
2.1.1 Plist的key值与含义9 ]% w3 W/ m5 v2 K+ ^: M
StartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。
0 E1 [5 C: [* I- d. O, Z. d
# B4 D! P& h$ ]! b0 Q
0 Y# F9 @$ M. s+ A# `5 l2 c9 n( d4 u4 k( }* q- m$ h
该plist需要获得root权限,包含了几个方面的内容:
1 g3 @) S  P- Z4 _7 Y# d5 l/ m
: f( C0 `& z, r1)Description;& R3 N9 W# ?  F  J
4 }3 w. t% C+ Y% P0 u; M
      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。
9 I# {+ D, y2 U5 U5 Q: q' n8 j1 v: F) ^, I( H( p! j
2)Provides;+ j3 Q( u9 J/ P$ U# ~: Z( {+ ^' x

7 o. q7 t" |$ }- _      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。. E6 S' Q% s" u- l+ @& m

. Z- g9 n% y  [. k8 x0 A      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。4 [1 S$ }; Z& h0 C  A- w

  e, ]5 Q6 h& l% M3)Uses;# s6 v. J) h/ P6 _/ B0 ?4 b
2 L4 Y! u$ ^" g3 ^4 @4 _+ }
     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。: B3 s4 M9 [* R

9 z+ e' w! L2 m4)OrderPreference;
  k4 f1 r6 ~0 w7 L  x9 Q# K/ k1 }& {' L- s
     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。# u) |/ P8 F0 n$ R2 D* V/ Z
$ |$ J7 |# B2 L% J
5)Messages。
9 a: |) |% Q* w- W: D9 c' b" l9 ]: ^
2.1.2 创建一个StartupParameters.plist文件8 e% k" w4 U% b
<?xml version="1.0" encoding="UTF-8"?>
0 W6 A' `1 B' P9 E- l2 @1 x% _$ @8 M<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
$ Y2 C4 @: k: @    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">& Q/ |  p% C: H+ U! U  ^
<plist version="1.0">
3 B# H& u' O2 ]" d% x2 u, v/ N<dict>
& ^2 ]" F2 J  _5 m" Z* U    <key>Description</key>9 G8 v; J3 P) Q$ M- b( Y& l3 \
        <string>Iceberg Control Tower Initilaization</string>
9 h. x4 q- e  T. y; L$ ]  Y    <key>Provides</key>
  w4 }, z- n+ ~3 a$ U        <array>, }3 l  F" e/ w) G
            <string>Iceberg Control Tower</string>& k& N8 B+ Q6 u+ P* J* }
        </array>4 J" Q5 K' m+ ]6 M( J  v8 K
     <key>Uses</key>
  G2 e/ f; A; H        <array>2 f& b0 R1 @% N# \3 U
            <string>Disks</string>: T* o4 h( N; o0 d3 q
        </array>' b8 i4 I: G7 I9 x# B" f/ G
    <key>OrderPreference</key>
) \5 \5 ^7 p9 X) M% C0 J        <string>None</string>* F% q$ g8 k" I  U1 N
</dict>: t2 A8 M* s) o3 A/ G/ R. O
</plist>
" `4 b# a0 h8 m, Q  V( W
, A0 I2 i# |8 A' k' z# n( X/ \
0 i$ ^, m  S6 L8 r/ w9 C6 G( u7 q
2.2 The Executable File
/ h% P6 n% g. P3 Q注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。
$ n# W; i/ K$ U1 L& f7 _) |
1 v. Y  V1 X5 h$ b$ F, s  M      2)操作可执行文件需要获得root权限。
. W' |' R) v" |6 C1 [
6 ]8 n2 V3 F1 V8 h0 T( e7 V/ y      3)可执行文件是一个shell脚本。/ S$ ]" J: j+ i- ?0 b. m  i

! r# D. s# z7 I: M打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:
" c. ~- H, M7 W* Z
7 D0 i) ]- b, {' @1 b0 m1 |% s7 @: f
6 M: o2 k$ l6 L' t" M" H; d6 J/ T  `5 {! z% `$ x
一般的可执行文件包含这样几个方面的内容:  q3 T" z+ v2 e# w3 H
. x; _+ x9 L$ k# E
1)./etc/rc.common
3 C- f" M+ H. h  [% R) ]! m' G
# P, O) \- ?! {' ]& QApple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。; t5 J, y% i. P' w" p- Q
+ [/ i' R  u9 \, O
2)StartService(), StopService(), RestartService(), A2 e3 F# x2 f4 o0 Z

/ \0 Z; X1 e: C, A1 e3 @, k当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。$ ]) K; M' A( y. y- A) D- \
+ `8 u) M) J7 c1 a
参数含义:: }9 d) q# [( C: Y! w7 d
8 e* R8 X0 u5 A. R
start:开机过程中开启服务;& ?! `" S0 R( Q  d( G) P

' G% M) e. i  b. xstop:关机过程中停止服务;
4 V, T+ |* f$ L5 b9 X. X7 n0 j) I
/ s: t$ ]# k( _2 v: b) trestart:在特定条件下重启服务。# P9 L1 t' N3 [- t5 k, W# o

, O9 ~1 C2 Q6 s+ M3)RunService  “$1”
$ W" \% X2 \* U
6 g) E1 T$ t3 ]) G7 T执行传递给该脚本的第一个参数指定的服务。
/ v- t6 Z; b2 {1 K( e+ Q# Q% q' x
" b8 z3 J" k# H“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。
, C! c% m2 _' Z. a9 G6 Z/ ?2 v$ b7 x. U9 }( {  l) w- w! ?, D' r
3. Launchd Daemon
" E! N$ d2 g% g  l- Ylaunchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。
2 D$ F- m8 h5 W- M3 l2 V/ Z; i
; m. }' D' U$ U: L  ?  g! Q( h采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。! F; @/ n1 K8 @1 E$ P

; R8 |7 z- j, y( |# Z* k8 ~3.1 plist文件格式及每个字段的含义:
% a, C4 H2 O; Y: r- q
4 X( h( \2 E8 m' `: W
- L5 K: s3 w' \; R1)Label【required】
5 C% C+ x  E9 [% K2 I3 U. b% s/ X4 c+ a  {. q4 D2 ]: E
该项服务的名称。, y7 v6 D: e2 n: w

! Q; [2 i8 F# l: M2)OnDemand【optional】4 d: N9 z/ r; ]5 b: `
* K& Z; l/ u+ ~# L& G, L) C
10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。
3 ^& F, \4 g: k. `& @7 j
1 _' ~* B7 M) g5 y0 R1 P3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】: r! N5 y4 \& o  A8 Y

' ]0 |8 ^/ h& P+ ~0 w指定可执行文件的路径。+ [& E7 C  k) Z1 A% p# i3 e- [

$ V. Q+ \; c- i% l5 r/ c* p# q4)RunAtLoad【optional】9 B( r5 T9 A' E* e

0 B& H' W% |6 p# a标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。' _3 k6 U+ u! a( `0 V" S

2 s9 M& @0 Z& {# A/ x5)WorkingDirectory【optional】+ K" J( O2 }; q. M1 t
- M6 ~3 Q3 F' t; w4 ~. j% |
该key在开启可执行文件之前,指定当前工作目录的路径。
% m2 c; s' {- M- i# e0 `' u3 u8 i
6)KeepAlive【optional】
1 ^7 M  e8 X# h) I
" R  ]/ g' z% ?# w' i0 Z这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。
' B# H. C9 E6 |  `' M, ]9 E4 _1 s1 X, g+ [1 U
3.2 创建一个plist文件:
3 }* R, {: M% h<?xml version="1.0" encoding="UTF-8"?>/ S, y: K7 @6 V& W5 R
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" : S3 P* c. w- c
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
8 v' s7 C: w- A<plist version="1.0">
& o' d. U5 b0 n% @' s- N; T<dict>1 c8 @" `! x/ j: D$ t/ Y" j# h5 l7 a
    <key>Label</key>: H) r: g* x9 Q
        <string>com.yourcompany.HSPA_USB_MODEM</string>
. T' p. T" `- O* a. [    <key>OnDemand</key>
! K' z, F: w$ A        <false/>' S( N- C# L# |8 @1 d4 v& _
    <key>Program</key>4 h) c  ]: O6 ]4 e
        <string>/Application/HSPA USB MODEM.app/Running</string>+ M9 n. y0 f1 i" b2 _
    <key>RunAtLoad</key>
, J+ Y3 N. P; }9 ~7 j        <true/>+ c) O3 n8 C" C  y; e& K. r
    <key>WorkingDirectory</key>2 ]) b! j4 ^4 e% @6 e) l
        <string>/Application/HSPA USB MODEM.app</string>: _, Y, p$ }6 s. P
</dict>
" i8 O$ l  D8 l# D% I</plist>
! G  G9 o$ p% [- j4.三种方式的区别3 c. |; X8 L0 F) Y1 N. ^- l
初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。
, G, Z) _. R  j/ K' ~1 _9 M7 \; w5 A/ o( M  x! D* h1 a- ?. H
总的来说,LoginItems 和StartupItems的区别较明显。0 s. s; u8 E/ O; ?5 m4 V
  R8 V3 ~  R4 s( F
, {3 c* l4 s* S# z- k. v4 ^1 I
对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。5 X" N/ @! o( @, D
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 01:40 , Processed in 0.048832 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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