ChinaFAQ论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1793|回复: 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。- h9 i* O/ z: g0 w( ^; Z9 ]3 G

$ [) I4 c: |# A6 C. I& j+ Z1.Login Items5 h- j  u: Z2 D
打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。! J& q7 [8 y7 s/ T  z' Z
/ m5 a9 i* x' O

; R# L/ Q/ @. k
; H' m) k% p: }. Y2.StartupItems/ y5 h' H/ F- p: {$ B3 G. i
StartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。
5 w$ d( |( G! B6 ~4 Q4 _$ r9 k( g, k7 I. u
StartupItems一般存放在以下两个路径下:8 m/ W& b; y! T* S# v' g1 W- {
. Y+ b& n/ x5 `- a$ ~2 }+ G8 K
1)/System/Library/StartupItems
3 l0 t# P3 Z# Z/ Z, w& R
. h$ e3 p+ J- r/ f2 l2)/Library/StartupItems
% C2 H, _1 E3 V+ @7 ~# ~- l. ]/ o
7 ]# U& Q: Y' c8 B" v7 k大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。
0 l2 i* x) ?7 R7 E# C+ @3 k4 w( {0 h1 r" U7 D4 R  O% r/ @
这里我们以/Library/StartupItems目录下的IcebergControlTower为例。
4 a0 A( l, w" N( D& _1 B5 y- ~/ M1 l! O/ \" r1 Z: ]7 S, N
0 p& I+ }8 H2 ?

: F# r$ S  R! ^- i简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:
% h% C7 s1 _: S: Q4 E  @+ u) ]( V
2 m. P4 K  p' c5 |4 ~! g1)可执行程序;- D' ^+ h3 U+ ~

3 V" W4 W3 D& B& V! A' {2)包含依赖进程关系的plist文件(StartupParameters.plist)。' o' ^/ u2 V6 J2 Z; @+ o" ^
6 U  W. w; E  A4 {
2.1 The Property List; J$ b, v  ?, G
2.1.1 Plist的key值与含义" Q8 r: |5 o" J4 U) k, Z+ W
StartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。
) [. N5 M+ U' a" F, r& K! C: T  j  q; M& Y; j% c. S
, c; ?+ V8 d& J2 @
1 B0 z4 K) g% j# d  A) m
该plist需要获得root权限,包含了几个方面的内容:
' Y5 O7 A! d. a2 t- ?+ W& I, ~0 i$ U* j! Z9 e( H0 u5 @' u2 P0 A
1)Description;
+ Y% w: D: c" @: i1 ~6 }$ r/ N3 ^% p1 }: Q
      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。4 ?% e4 X& x/ n2 z
4 `, d4 |. T' C0 y. I) C
2)Provides;
9 \( M% B1 F2 E& ?
3 @) n; Y" L  F3 O+ g$ U# g& J8 K      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。
" b& r; t: S4 g& x. u" R
9 V3 h2 V1 _: h9 x# r+ a+ Z      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。
9 S" e5 x8 s) c: e  f4 b4 `" L' b4 X% I* f2 l" R' a, K
3)Uses;# b/ q) x& Y  R* Q' A: F

" b6 {! W8 n7 d' z$ E) E     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。
- K- H, g* P/ n# q" r5 B+ I4 a: S
( ]4 ?$ o. U) c2 J5 G+ L3 K6 c$ J4)OrderPreference;5 Z4 F+ v0 \3 x, _4 w, l/ ^% d/ k

  |% j/ A2 M: u8 W& ^4 {7 c     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。
* F4 `7 D+ o: M% l5 K6 ?" k& X0 k4 J) u% e
5)Messages。0 a. w* `0 a: e8 t+ {8 s7 K! d1 H
$ R- ~* L$ \% ^3 M/ n! s
2.1.2 创建一个StartupParameters.plist文件
$ |! g1 E: b2 J, s$ q( S$ ~1 G<?xml version="1.0" encoding="UTF-8"?>3 n9 B- a7 ~8 ^2 T/ F
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" ! ~9 g- }' ]+ C$ N" z; k; G5 j; x
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 C8 ?- T* _) R4 C<plist version="1.0">& ^1 x  ?  Q- I8 R
<dict>
* H4 G- f# J  c8 H% K2 e4 X: j    <key>Description</key>
! l* j" ^6 l- J: D* a        <string>Iceberg Control Tower Initilaization</string># u4 c# b1 |) j4 H
    <key>Provides</key>/ }7 H# V& \: W+ F4 S9 y+ ~0 P- Y  K
        <array>
" ?# r3 K) X. [            <string>Iceberg Control Tower</string>
4 q2 ~2 k, s3 h9 |        </array>
  P0 S, i  d: L& X& `     <key>Uses</key>, @4 B5 _/ C5 |4 a
        <array>8 S" e4 L0 {& Q; ~1 a' a9 _
            <string>Disks</string>
3 d9 `0 X1 S- L% Q1 a3 H0 V        </array>9 E8 E4 h- y9 t( D) r
    <key>OrderPreference</key>
" ~& u+ a: w3 Q7 w" d        <string>None</string>* d' g* l1 O6 p7 j, n4 k/ \
</dict>
% r3 i/ F" s* _</plist>; C) k  x3 K. A0 M% I' d* D' |

" r+ N1 r& H* B8 I
0 R" j' `. [: q: a% @
5 h* D* O3 o( ~- l9 I0 N0 Z2.2 The Executable File
# K: m- a4 X) k4 u5 Z! _注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。6 G1 Z  ]( f8 G% w9 b( a
6 M( s: W- ?& f- u6 C
      2)操作可执行文件需要获得root权限。
/ ?) ^! o+ ^2 U. `2 e2 f! e( f4 v
      3)可执行文件是一个shell脚本。
/ O" F& K! y& i$ P" F
. c! l' V9 s9 _" V! T* l9 l打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:3 {0 O. J/ v7 _9 [; e( Q6 a
4 n- z" P0 Z4 Y1 ]: @
6 D5 h# V1 A$ Y$ U

4 O0 i6 u$ n8 L一般的可执行文件包含这样几个方面的内容:, o$ P5 T$ U6 x, Z3 ^

3 h4 ]) u4 a. m" H5 f% E! A1)./etc/rc.common+ M5 P' a0 v' @6 R% z# S" h
8 ~! y/ h5 f6 Y, K4 C
Apple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。" |% Q. \  K% t2 T
7 z6 r5 G  U+ w
2)StartService(), StopService(), RestartService()
9 H: K4 {6 ~; g6 A& E8 f
/ I$ }$ z+ `( `' T* _! g( ^* U当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。( L! }1 ~' G$ J  G: p

9 `) `; i/ b6 d2 j' u- {参数含义:
- R9 r$ t  x1 K- |: o( j
4 g: e; q9 x% b' `start:开机过程中开启服务;
. G, U3 l2 U8 H9 F5 h7 ]) [; [$ \/ g5 c( `3 P" u
stop:关机过程中停止服务;
3 B: y$ j* S3 ]8 y  N& N9 E$ q1 a0 F( Y: P, @
restart:在特定条件下重启服务。
; L/ I8 c  P% m$ F& p* C% p: r( C
3)RunService  “$1”
* G5 J# E5 p- ?7 E" s- H+ p' c8 j9 E) q: i) y+ \0 S: k& Q
执行传递给该脚本的第一个参数指定的服务。; b5 m8 b# v/ J9 N3 h
" m- w3 ?3 `* i3 S- x. R7 p. W
“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。2 W7 v- o$ c4 t) L

! Q/ z3 F) y7 ~* C3. Launchd Daemon
! @# R" F+ w, z; W6 z' Slaunchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。8 Q7 n& Y) m0 g0 M  W% w7 E6 y

- f6 Q$ k! h8 r9 O( A采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。. |" x$ B* T5 _( B

; _6 u! s: c& U: V9 Q7 A3.1 plist文件格式及每个字段的含义:% G8 Y: O9 J% g7 o3 B( @2 L- I3 Q. `
  x: `, W' ^! w: I

  m- m  w$ c+ J' f) L% }, \1)Label【required】
) x1 h, F0 I3 C, P. g& E, k
# U: h( u+ w' C/ L该项服务的名称。
% o( ^9 K/ ?7 |$ g5 M
4 Y# |4 k- v' m5 |2)OnDemand【optional】
6 U% ]6 I3 x4 n6 E4 Q* R2 P* U; e2 ]: L+ Z1 h) [* A8 E
10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。
8 ~* l$ m9 a8 Y
  i. o0 ]) m) X0 N3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】( a9 D% V; r& J9 k; \1 z

7 e% h2 E" i& A) \  j指定可执行文件的路径。) g8 X) {  W' s! \

& k6 {, w) t( Q4)RunAtLoad【optional】; r# `& c% u$ |

* f9 r! f1 C6 w* ~: v标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。/ @6 k  f$ D1 Y: v: A

. i5 V  ?# b6 U, g% u  a( [' F1 S, s5)WorkingDirectory【optional】
( P7 ^  u$ i4 X/ q& q- y; a( k- q) N' V, P2 z3 N, v
该key在开启可执行文件之前,指定当前工作目录的路径。
* {5 P& ?/ y2 W! y; |. o7 f$ ?  x$ L4 g) B  f, a% l. A" V1 u$ l
6)KeepAlive【optional】
; P# O( W- B+ ]7 l7 Q6 q% q% Z  X/ @/ h' h- |  Q/ n
这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。
1 W7 s5 I2 s4 \: E; y* M. Q
- ?9 K: D% {  o! _$ m: R8 `' _3.2 创建一个plist文件:
; o# H) z: ^  ^# G<?xml version="1.0" encoding="UTF-8"?>
9 ^# x2 w( B2 }" W3 r<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" 7 G0 o  j8 Q4 H( ^
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
2 ?: R0 u8 B$ W( ^! @( s* K- ~<plist version="1.0">
/ S3 W* \2 e8 r+ ~0 W<dict>" m" r' r. H3 B
    <key>Label</key>/ {, J4 M& Z6 v& m' C
        <string>com.yourcompany.HSPA_USB_MODEM</string>
2 \4 C' m; d+ C& T) h    <key>OnDemand</key>
- [$ S+ U; ~- ~$ d8 P% G9 \8 n4 j( V        <false/>
7 W8 U, {( I$ J. R9 Q    <key>Program</key>
$ x- _9 g" u. R5 b+ f  V/ O9 y) j        <string>/Application/HSPA USB MODEM.app/Running</string>- I# }+ S9 K9 t
    <key>RunAtLoad</key>/ X8 t' p. i6 J$ Y, |
        <true/>
. |0 N2 C: X* w, a0 w. }    <key>WorkingDirectory</key>+ [* i5 v0 n8 T+ \
        <string>/Application/HSPA USB MODEM.app</string>
9 ~: a, p) N% b( T</dict>
0 h3 N: [) \1 [. T</plist>
8 m6 u  V& {$ j. D4.三种方式的区别
4 k% l* n* n4 `初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。
+ @( o, |: }! |$ i
* B7 y) b" M: @7 f: k4 W总的来说,LoginItems 和StartupItems的区别较明显。
! `" V& u% i( d9 ~3 o+ R- b# t2 m2 C
- \7 [) ]0 H  I7 u' r
对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。
. l' i" C. i) Q7 u. _- A
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-11 22:04 , Processed in 0.053780 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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