ChinaFAQ论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2126|回复: 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。
+ k1 f( S( b6 ~; T) Q" ^3 S/ d
: n6 e# K& O/ V2 j! @: m' L0 l: S1.Login Items; D$ y. d2 ?4 B5 q, l
打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。
' D; Z6 [* w0 R6 \
0 N0 a- h9 U8 l( _# D) P) A1 T$ r7 }, _: R+ i  q

  c$ G! Y- N2 Y+ |9 G2.StartupItems7 U& D' L8 D& ^+ I, X5 c" m
StartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。
# K  J1 Y0 {. Y. `5 m$ k" p/ f% x9 y9 d  J' w) r
StartupItems一般存放在以下两个路径下:
" N  w; }6 ]5 ~# s0 v) T* ?* i
1)/System/Library/StartupItems
. o$ H/ @. ^" K; P5 v" ^- s4 |/ q* L4 u. a* V# W
2)/Library/StartupItems2 U8 Q/ _2 T- q. m, F- z  Z
$ z2 r; i3 D) s3 M, N" Q, V
大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。
- u8 H+ f9 `, {) `" R: G  i" h4 F0 x9 P  B$ n
这里我们以/Library/StartupItems目录下的IcebergControlTower为例。; V8 ^9 P% a% B+ y" q1 ]$ k

$ `) d) p% G* a+ B( e: d3 a8 |7 q- D2 u
1 }- ?( F; N0 \) m& `" i
简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:, ^+ p: E+ j+ v$ b  T( U# n

3 L0 s' q" u% j. [& E1 p1)可执行程序;6 W4 X; U& R/ D

% q7 l4 G  r# z8 K  C: g2)包含依赖进程关系的plist文件(StartupParameters.plist)。
% i5 r% J0 g& j# i
6 s8 R+ l( J7 Q+ g2.1 The Property List( Z$ b* w# |3 {2 B3 u9 l" I) e% q
2.1.1 Plist的key值与含义
- N0 G3 [$ v% m- Y' L' zStartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。' Y9 H- ^9 a. N5 w: Z: `
1 z, W3 K) m  g  }

* p$ d( ~% e) ~. I
) U* m! a+ I# p4 P该plist需要获得root权限,包含了几个方面的内容:4 l$ A2 R' O$ @

  p: o+ |+ @% v1 |/ ]; a& ^& b1)Description;
1 e7 B! [5 r, ?( f# v- z' C; D# o+ w: R/ j& H
      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。7 U  o; w7 V  C+ n. n. B- z

6 l( h7 `" A/ s- B5 K' [6 O4 M1 Z  c2)Provides;, F" F0 b% Z5 q. A( g" h* ]& t: a* Q
4 X: V  u( c7 k- `8 a
      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。
, @, j9 E- S5 [1 ]
' R: X) U! x7 d& |      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。% S, O% b: Y+ @( Z' |: v- S
. N2 s$ t; G! I: q) _) X
3)Uses;- s3 P" y/ n7 N

& B# t* i4 v+ ^* Q" z     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。
3 ]: ?8 L5 c! v) m9 ^' u
1 y/ z- }1 p! f, a6 q4)OrderPreference;: q' _) P% [- }5 m$ N# e. O
* v4 s( l- G3 b( i( t" y4 ~
     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。
9 i* d! j5 j( z3 |
: R/ ]7 q; H8 \8 f7 M3 y) D6 j) M5)Messages。0 [' O" @1 K6 Z/ o+ B4 F3 y( W

& [- }$ u& C2 m' P4 W5 r2.1.2 创建一个StartupParameters.plist文件" X6 V1 r6 [, R
<?xml version="1.0" encoding="UTF-8"?>. [$ ]$ [  @) Q8 Q7 E
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" / ^+ y0 O. l0 i$ [. Z
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">4 I  c9 `0 ~. Z8 b) |+ w9 j0 n$ X
<plist version="1.0">
* v* |* C' U; P' R; d. L<dict>
, f- s  F7 w0 L( }/ m* q& d    <key>Description</key>5 [+ F3 k3 m. I% @7 [0 G* I$ B& ?" N5 h- z
        <string>Iceberg Control Tower Initilaization</string>/ r9 i6 Y! V( P/ t3 G  _9 n
    <key>Provides</key>
6 i* ~9 _' i, B3 B8 Z( d* a& ]        <array>
8 w4 a/ `5 z* h, n+ t6 h7 H: w            <string>Iceberg Control Tower</string>
  _: d6 i1 Y2 @* s        </array>
7 M' `6 B- A' h& I( y2 Y, ?     <key>Uses</key>* h4 R" c5 m/ P1 r1 _, ~' Z
        <array>
/ ]& [+ S) J; |3 X6 Q            <string>Disks</string>$ Y, h% I# `8 ^% `; a
        </array>% V; Q$ @; `7 e5 v
    <key>OrderPreference</key>
* E8 o% b" ?. s& a: k        <string>None</string>
' r) r. \6 F* M7 Y</dict>
, F% F! [* g2 ~! g) W</plist>
; N$ D' r" Y8 @3 @, @
* |! e( U. S- S0 M0 W/ |5 u# R 2 P, Q7 z3 R1 ]( I, s" E& _$ P
8 p" F% m9 [% O/ @0 m' c$ i3 X1 `. X+ K
2.2 The Executable File& C: E9 D' A  w. E. r- H
注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。% R' j! l3 [( ~. B

# n2 U% U& g6 l      2)操作可执行文件需要获得root权限。& L  g' j9 w# m9 U

* a5 |* Q$ b. M/ X      3)可执行文件是一个shell脚本。
0 \- z8 D, y5 x$ Z" l3 a, i+ k
4 ^5 T4 D: F/ P7 r' w8 t% a$ w打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:4 w0 e" q/ O& Q( N
+ c% `* t4 W1 a+ [5 _+ c
# b' p. B, J1 i# E: Z$ X6 [
1 x; q% A) s+ T! V
一般的可执行文件包含这样几个方面的内容:; q& i2 }3 @1 a% Q; A4 \" Q

* m, h& i/ y2 C! s1)./etc/rc.common6 b( m2 r. O% ^+ d  U4 a

$ f) c7 }8 k' W4 y2 e: GApple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。
3 E$ |! G5 Q& q9 y1 ~/ L' {6 N
2)StartService(), StopService(), RestartService()
2 g% h( ^6 g0 Q0 N- y* Q
2 @/ p- n* v4 a( r% C当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。& n! _4 y  A6 M+ y; y8 q/ i% ]
5 o! Z( g" d& m% c( M, S
参数含义:
9 n  h  v% E9 p) ~# p) j3 X& H
start:开机过程中开启服务;
4 F$ j1 R; C8 A3 H& U* i5 R% w5 K1 B$ h
stop:关机过程中停止服务;4 N' L+ ^; r( p5 Q  g
- {* w7 w# a4 I4 m# E6 w
restart:在特定条件下重启服务。
3 C* ~7 k3 ~6 q
3 C# N0 ^2 w  A$ g! [  z4 k3)RunService  “$1”3 s# }# H8 {2 f# }" H1 `

( j( q+ u+ D( U9 i/ ~$ P执行传递给该脚本的第一个参数指定的服务。
3 e) S8 Y8 c4 F3 Z! ~2 k; _5 S4 n/ ^
“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。
# Q2 y3 v) p2 c* t9 K& U2 Q
% N- D' ]) Y$ R  W0 {1 b; `7 \' h) S3. Launchd Daemon& j6 j2 P* M4 [( q
launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。. d2 G4 Q' L+ K; K* h
4 A0 b5 F" a' v) [) T0 P) q9 U& `
采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。
, m5 O/ j; C( U+ a1 v7 W- n0 m8 d8 m, b: m! q/ N, r
3.1 plist文件格式及每个字段的含义:
2 A; p$ O7 E5 }1 f, ~$ r" f% c
# n" k  X* R# ]" r
+ Q5 N. ?$ [7 Y! Q# ^" m$ Z1)Label【required】
$ a7 b  U. z; ?- w* x4 J$ D5 O0 ~/ X5 F9 C9 H. q1 @! E# B. f
该项服务的名称。# {& S6 T+ d$ N  n

7 O' F& |4 k& e. h! C" V2)OnDemand【optional】
2 D7 x6 z  \6 m/ M* X4 I& d
. `- j4 N: E0 ~9 {' X10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。$ [" _+ P# Q* X2 h- |3 [

' o) N( E, k7 Y; ]1 x3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】
& R5 S, S7 O6 p7 I5 J7 P) u0 X8 H! W4 g
指定可执行文件的路径。
" R; S9 C- l8 Z7 ]- z4 F1 m: e* D1 d
) B# P9 @4 a; @7 J# |( \& p% ]/ O  T9 o4)RunAtLoad【optional】
5 K+ d% \4 d5 W6 k  s# D2 L
4 O8 ^9 y* T% Y1 n' _5 @) w) Z标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。- R) m# g' ?9 z3 h& T
/ ?4 Y/ s7 m  V, K
5)WorkingDirectory【optional】
+ t" C$ f: Z8 q7 i
8 B4 [3 _- Y6 y; z, J& E该key在开启可执行文件之前,指定当前工作目录的路径。3 H5 w5 N1 Q2 V2 c% ~" q3 C0 y0 f

; |9 o9 a$ l' I9 _4 s! y' o6)KeepAlive【optional】
( ^5 X; c( o# Y7 W& z( z' ^0 m; p3 ~% Z' n, [
这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。, n- U5 w; Q8 O/ {& K
4 T; W1 g4 e' f4 U9 L! H
3.2 创建一个plist文件:8 h% I$ k& D. T- \* A% z
<?xml version="1.0" encoding="UTF-8"?>
; ]( A8 g5 P7 E: Q7 Z<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" # h9 |8 k* w0 @4 s
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">" w" F5 F7 u: ]; C2 c" {0 r) ^) a
<plist version="1.0">4 y8 W- b+ t  p1 v
<dict>
4 h: I* L& _0 \: ]' i    <key>Label</key>
0 N* _! z* a. J8 [" V' S        <string>com.yourcompany.HSPA_USB_MODEM</string>
& b0 U1 I) y/ l    <key>OnDemand</key>4 O& L2 R  X3 P; d, \& w2 H. z
        <false/>
3 U7 F4 a  c5 g9 t    <key>Program</key>' D1 \0 ~) P1 \" `6 y2 K
        <string>/Application/HSPA USB MODEM.app/Running</string>! N, M  m8 T" q& C& w
    <key>RunAtLoad</key>! `2 o, P* U: N/ X) z2 O
        <true/>
$ w- w6 e* @/ }# T( H- {    <key>WorkingDirectory</key>
$ N( D0 i4 D+ @/ l9 t        <string>/Application/HSPA USB MODEM.app</string>
5 Q, H- j2 ~( a# k</dict>
/ U+ L  Y0 ^9 m- _</plist>
' i) I: v/ I3 U4.三种方式的区别
5 p/ T+ l/ E1 J# E# v& f* j初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。
2 @+ L1 N7 \5 m1 a( E9 I7 N, k" Q4 v1 T3 g& [, N, ^
总的来说,LoginItems 和StartupItems的区别较明显。  U* g( ]; d+ }  O- o

+ `1 D& R- c( M8 o" e( d7 P; [* Y
对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。
) `; g, L+ z3 f4 K; z# \- }  u# g+ O- }
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 17:29 , Processed in 0.058712 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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