ChinaFAQ论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1020|回复: 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。6 m7 h' A" n! H2 l7 o

0 N6 \; h- w9 v! w+ Q* J0 E1.Login Items
2 p! ^8 d. x& Y0 I6 I打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。; c$ L0 m* g  M' @! ^6 i# d1 r
: j8 t7 V  P% f! H
/ x7 Z2 \- M* v# U% ^4 }

% `% K9 i8 u' H! A1 S9 W& x2 o2.StartupItems
) \  e. K: E9 G5 D& ?5 X% bStartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。
( m) I" e" d; }; j. b# {+ f; F
; V$ w) Z" i0 V% Z. {StartupItems一般存放在以下两个路径下:8 |2 A7 r: @( f7 u

- e8 [8 L. O, v, O2 i' I1)/System/Library/StartupItems: i7 v1 [( ^6 a9 f! N0 @
( ]0 K5 [* s/ U& g5 ]/ M; e
2)/Library/StartupItems3 F- h1 ]- Q5 S+ r
' x% x1 x$ a5 e' e& t: t, j; q
大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。; z, t5 v; w) D

5 J4 U7 l9 s6 d$ n$ |2 a# d* g这里我们以/Library/StartupItems目录下的IcebergControlTower为例。
/ Z3 d, h( \# J( n8 e: t$ P" U4 X4 }- h5 b8 l

% A, ~) @: l* x3 |4 h) _0 y! \* Q5 w
; G' \4 P2 l0 F4 s简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:5 k6 V2 `( |# H# c0 u) D0 H$ s: y

  F# l5 v7 t: ^% X1)可执行程序;% [! J1 _( [( B( S1 B* p

) K/ q( F. @, a3 q9 J2)包含依赖进程关系的plist文件(StartupParameters.plist)。
" S' k4 l, [6 \- c0 R8 s) ?1 K% V& l- c+ V
2.1 The Property List, v, B# Y) x. u5 R& N4 E. P1 w
2.1.1 Plist的key值与含义
+ M" W1 I1 O" kStartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。
: D  s  E4 r4 ^9 l6 X( y* t$ r) N) k

. K/ s1 p6 U# c# a& @' W' A* ^" c) l% n, u
该plist需要获得root权限,包含了几个方面的内容:) ^1 \2 M, L- z& I

! Q( [% E7 K8 R1 e& E1)Description;
% l8 p8 d% N: _: ]0 W5 s( l4 ^2 N' U0 G5 W( a9 R
      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。/ @/ T+ |9 ^7 V0 k3 F- b
0 V. g) a, c! ~1 V/ s/ u; y0 |) }- z
2)Provides;
- e1 T: `  T/ n8 p- O' k& Q
# X) a- @) K9 h: y* b      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。
. t  B9 S; T/ k0 n6 Z# a2 n
" K- I9 r8 n4 B3 y5 m# _      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。
! I3 G* f9 i6 C+ q  \- T# j+ j6 D$ J( `7 v5 q
3)Uses;
0 p1 \7 \+ a# x* r$ o2 W
; r3 r, O. p. `4 c9 t     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。7 Y: y8 Q0 y% L6 m, ?
7 ~8 H% p7 x% R+ L" E
4)OrderPreference;
3 j0 a4 E# U8 u* R+ k% K" `% O
2 _+ W5 o7 ^4 f- @* D     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。
2 C  ]+ N( Z- T* f. n8 y; L
1 X9 t5 n+ l  X! O: a. h6 t, y5)Messages。
) H- J5 y6 ^% u, W/ \8 l7 U' U& I8 f& Y, m+ h. ^
2.1.2 创建一个StartupParameters.plist文件
+ q: [; N: c  ?/ D7 p<?xml version="1.0" encoding="UTF-8"?>
' d1 F) k& g; y/ P8 i) _<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" ; I) i1 l9 r6 x/ F* z% M6 \
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">$ X, `8 r4 N) m& P  ~6 X
<plist version="1.0">
! l) n* @* U. ?5 o& k9 x" k<dict>2 B4 O& ?5 I( J6 t9 U; w- N
    <key>Description</key>
1 \  u! A' _  s: s4 N        <string>Iceberg Control Tower Initilaization</string>/ U, B# J2 A5 D1 d8 e' q$ `
    <key>Provides</key>
2 {! h% {# g' J        <array>
/ f# u6 U8 a9 [1 {& V            <string>Iceberg Control Tower</string>
1 a8 S$ g# n6 Y) @        </array>
) Z9 z7 @) D8 s& f9 X4 i6 f     <key>Uses</key>
: D) m4 l& n7 u# Z* W        <array>  i1 Y& y# [2 D( K& r$ U
            <string>Disks</string>
" W! b6 j; E  d0 j& \        </array>
7 R, Q3 d3 U0 n# a9 A    <key>OrderPreference</key>
9 s1 a3 q& j* y# r* A- ~; q        <string>None</string>
" s. q9 w& z4 m" m5 T" I</dict>
; y: c' z( }0 k: {</plist>
  G4 S2 S5 s- R1 U$ I. y2 t% P2 s/ N8 D. ~4 l4 I

" S0 r! z2 I, l7 s' A3 S. W+ d
0 P% o# }. K5 k5 W+ \5 Z: j2.2 The Executable File
0 g+ d- G5 p' H- R, M注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。
; A, w+ Q+ X2 [# T6 e9 N% E
9 ]- L4 V- Z" o' W4 d      2)操作可执行文件需要获得root权限。
, J0 F. J, N; ^7 p
* p8 J4 z+ A- X9 {( c' z& P      3)可执行文件是一个shell脚本。
4 d( y: R0 Y- [6 d2 W2 P, k; T' ^* t
打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:
9 {( {- k  Y! h$ h1 H2 U: V8 e: `" |, w* i

7 u4 t& I0 K/ ~* N0 ~- ?& @, j  q- w, t0 @
一般的可执行文件包含这样几个方面的内容:% P+ L0 n4 u4 `6 M8 W& K
8 Z: W0 [0 e3 t2 Z5 ~
1)./etc/rc.common# _/ }( J( v6 J9 i$ E9 m
! ]1 ~) S! M  W0 g5 B) m  [
Apple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。
1 w" H# V% ~" U. a3 r) W) ]$ F/ A6 y* f: [% s" D; M: ?3 |9 I2 g
2)StartService(), StopService(), RestartService()4 t) g6 L0 Y* Y6 ]
  K' U) T& M( ^1 j5 I
当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。
5 h. r' M( I' }: d; V0 @9 v+ U# k; K8 v' j& ?' K
参数含义:
* E* I# E, Z* S) O4 |3 T) s' a" |4 w4 _* v3 ^' A2 e
start:开机过程中开启服务;
1 m/ L% q0 f  N6 T+ k8 A. v8 H' {$ ~, U2 X+ a
stop:关机过程中停止服务;' V+ d6 d( Z! L9 c
3 l, Y% j" s3 W. i
restart:在特定条件下重启服务。
0 k' k' s  R" N
# y4 f3 j$ o- Q$ |# U# U3)RunService  “$1”8 E+ d) k3 d, \" Q/ }
: w4 s& V' u5 _. T2 B% T
执行传递给该脚本的第一个参数指定的服务。5 x7 D' F# V  Q' [
8 j" {" V" }4 u; u
“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。
: P" _. o' J" z3 U
6 W2 N7 T( E4 s6 {7 o3. Launchd Daemon8 @* e6 J* H. a
launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。
/ m* E! J1 S1 M9 Q+ F
2 {) P) A5 Z, L) [, `# L& F采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。
! @$ R, P- l/ Q: h% h* B9 b' z7 Y' v8 b5 @9 D# k
3.1 plist文件格式及每个字段的含义:/ D7 i* K  f- k! [- P8 y/ l6 P
2 o1 o, d% ^: p; ]+ Y. ]

7 W6 l$ k- n( u+ d9 P" D! m1)Label【required】
! r! u5 M( y) B: I9 C7 V1 v
$ c- I; M+ i/ d- J, k该项服务的名称。+ E' C. A* h  x& I! r9 _
/ }* E1 D$ D; I
2)OnDemand【optional】( S' C) R* ^8 V" |3 B# y& |: o
. m- Q6 A8 X$ [" b% [/ S
10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。# r* L$ Z1 c: G: o. t! W1 @
" V" @0 m4 b7 P/ Y) t
3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】5 E5 J, {$ z4 P
( a5 s9 G% K$ Y7 S$ a  p
指定可执行文件的路径。
5 \1 F7 F: F9 l* b; z* k8 q6 t% l' w' C$ {$ Y- a9 D( i
4)RunAtLoad【optional】. P% B/ W7 Q2 `: v4 }( F

. ]! R. O7 s8 s4 s5 @* A# R6 g标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。
( |& _) m" U8 C5 _. b  O2 B  ~/ i& T* X
5)WorkingDirectory【optional】& {# C. w3 H. R5 y5 D
) O: n" u2 P& [# z9 {& l) C
该key在开启可执行文件之前,指定当前工作目录的路径。. i# v( ]. {) t! @/ S: h/ l# `

2 I, M9 p- i' p( E6)KeepAlive【optional】) y+ e' O3 n+ l0 j

+ Q! y2 K! z) {& Q4 P; z2 k, S! R这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。
( |  Z; `8 e8 J+ E* c# v  I6 N. x
+ h$ i  s0 j: v1 d6 M& x3.2 创建一个plist文件:
- h& |; a$ b( v<?xml version="1.0" encoding="UTF-8"?>
# V& {  \  D+ Y, _/ P% ^. h<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" & V. F2 O0 e7 i6 {( n1 {
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
# u2 v- v" p% Z1 h/ ?) Q<plist version="1.0">) }9 Y8 p: ?8 E; W8 H+ d8 U
<dict>
5 \0 u7 d2 Q5 d. U( Y* \    <key>Label</key>" z! c- g6 s& q) N
        <string>com.yourcompany.HSPA_USB_MODEM</string>
' ?" f) [0 a, p' t! _# q    <key>OnDemand</key>! i) Y: [0 f, y3 _
        <false/>3 ?9 {# V( S/ m- @  ]* X! W- g
    <key>Program</key>! l! p% c3 J6 |( A3 \
        <string>/Application/HSPA USB MODEM.app/Running</string>
  |7 L* \0 N0 T) i1 Y6 i1 Z0 ^    <key>RunAtLoad</key>
" ?0 ]$ q1 c/ D% }        <true/>% a$ y, B/ Z! O/ W* f0 B- j
    <key>WorkingDirectory</key>
/ E* P" o( r: F+ b+ p        <string>/Application/HSPA USB MODEM.app</string>0 e6 h$ i- b. @: D
</dict>
# H! e; ?! x, G1 e. s' x% W% W</plist>0 r- x& W' M0 F4 x5 \
4.三种方式的区别
& Q( b0 P% |6 X2 g1 P0 V3 K初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。9 X& h# U5 C$ R

) r0 P6 M0 B8 l  b4 g' @总的来说,LoginItems 和StartupItems的区别较明显。" g- j) O% E- R6 o1 t- g
) h* g- ~6 A/ l# l

4 [+ X6 {# j: F! W2 \对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。
  ^" j! l( B- u- Q" y- |. v
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 13:20 , Processed in 0.090682 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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