ChinaFAQ论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1794|回复: 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。
- ?& _9 F, {7 i" J# R4 a2 I1 X' l, N) E6 n: r- n! s; A' \
1.Login Items  D; ^' ~1 w8 h# t' V- `
打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。6 n# s8 U! s7 t! v4 c

. D7 Z- f  ~1 a% |; B  r
; j, e& _5 _5 Y+ j9 c- }4 @/ v; q  m! y" y0 [
2.StartupItems
' C3 W  _1 I" \* HStartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。
& e7 T# g! s# ?$ j  J# v# i3 t7 ?  Q
StartupItems一般存放在以下两个路径下:' z. F% Z6 c5 [. W# l  P3 E
) x! }- v( Z* Q4 L. r" P
1)/System/Library/StartupItems# }7 Y7 ~: i, U) Z7 ^( L
3 p  B% p9 c! \* r9 Y  V* e- Z  `
2)/Library/StartupItems
* W$ D: g$ V/ U1 W
$ S" k( j, U* G) b/ j5 R$ t( g7 G9 b大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。
! h/ P3 U9 ?" A2 c' r2 N  l4 c2 U( h5 ?+ l7 W
这里我们以/Library/StartupItems目录下的IcebergControlTower为例。8 b, e0 J# o6 A5 f

+ `9 l3 f. j' \3 p6 Q2 n* z. Y4 A7 n' G1 m
( |1 a/ b7 L% w% f2 ~% D
简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:
& a4 r; L$ S( ]3 e) ]: s: e+ |4 }9 x' {- q, Z% X1 b/ X0 k
1)可执行程序;2 N& Q5 P& u7 y

* O  S; Y- M( @3 e6 U' W3 E2)包含依赖进程关系的plist文件(StartupParameters.plist)。
( f( m  [" C- ]* |9 G: B$ u% M. A7 i5 `* c3 G: ~9 l# W
2.1 The Property List
9 }2 W+ i: u% N+ F  O& X; F8 t+ _2.1.1 Plist的key值与含义
; j, F- ^' `2 ~8 ^+ w5 WStartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。- j8 o* t4 `6 [) b. n

- a! b" z8 G% _, A: ?4 z* a! n6 N+ Q) T7 U

0 J! D( ]5 w( S" z; O$ t该plist需要获得root权限,包含了几个方面的内容:* U  l* y- M2 ?

2 f9 ]. W# L, x* R4 J1)Description;
/ s0 V0 b/ a/ |. Q( F+ Z+ ~# a9 T  w. C' C4 A4 i
      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。
2 s# j7 |* b3 ~: s
  o! m, G; m8 v3 ^. f2)Provides;! c# ?$ z* C' W4 Y- [
" w: M! E9 G; I% m9 I$ t3 V, ?- H
      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。
+ S2 R7 T; V, z2 q7 f$ C) d5 r" }8 M, J
      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。7 I/ u& q, \- `' L9 Q
% ~" I. W9 v( J) a, q
3)Uses;! h: k( r* S1 _3 ?: {
. _$ ~( V" D. p; r1 Q" ^
     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。  W) S6 E$ n& b2 V8 V

, }, T0 E0 g  w) |0 l& Q! |4)OrderPreference;
% [0 y7 {/ I* \
* K& x' q6 l5 a+ i$ ^0 Q     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。0 e% t# q+ P) D  L! L

9 T# k- v" Y& R" D/ Y5)Messages。* U+ h$ n0 Y) B- M3 _0 C! ?
5 S  w( z8 |* j4 L0 C6 p1 y/ _' u# X
2.1.2 创建一个StartupParameters.plist文件, X5 o5 X/ C, x; ?- ~
<?xml version="1.0" encoding="UTF-8"?>  J# _, s& P5 B; _2 i3 G4 B8 F' ]: m
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" ) c5 N0 J' I4 w
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">0 o% p" h/ U- `( R8 R2 v
<plist version="1.0">; |! F' G! D4 U/ a$ e& P
<dict>0 {5 ~8 ?0 S6 s$ Z/ ]. R/ v
    <key>Description</key>
7 |* g9 V: A- w        <string>Iceberg Control Tower Initilaization</string>
- M( |$ G+ _" e- c    <key>Provides</key>
3 ?) l8 A5 V1 @# J- h  T& Q# f% C        <array>
3 c: r7 t0 {* \9 `5 [% {% y            <string>Iceberg Control Tower</string>* m9 Q8 Q( M0 O8 ]6 A( J9 N
        </array># |( A8 G. }( b. W
     <key>Uses</key>
. |8 o" R" e3 J+ q, _        <array>
* E* f7 I: e0 z4 i1 `" [8 m9 v            <string>Disks</string>
, k) B, R% \8 \: L        </array>
  x- G2 c7 @& F, V7 j6 ]# x# h    <key>OrderPreference</key>: x7 ^. X0 L4 f8 Z) F/ I4 [+ @
        <string>None</string>
% N' \; ?' E6 ?9 |7 C, f</dict>
; ?5 m7 @# R/ p# m</plist>
/ O7 s# n+ E- B$ Z- j7 z: Z0 h
/ C6 T; L3 M3 @6 p9 R) v  T
) \# G# A( Q' P7 V& o" z' [* l4 O, K
2.2 The Executable File
  C" Q) _6 [) K注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。3 ?3 b7 G' p8 R  ?3 Q

" i7 N  K+ Q3 S  V      2)操作可执行文件需要获得root权限。
* x0 E8 v5 G) M  E4 L( d" w" H1 i, z$ v
      3)可执行文件是一个shell脚本。
6 H* B* j0 w6 ^# L- h0 y" r9 r% E' r1 s: n7 l+ [$ g: U" `  O
打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:: O' D0 I. C8 m" V' M
" q) E! y! q/ J2 l' C9 @

5 n, A& r: v' k) E: o7 d8 {0 U) B4 s" j
一般的可执行文件包含这样几个方面的内容:; D: R" \* ^' o0 B; ~
( i& M1 i* i! p
1)./etc/rc.common% }3 ~) |' U! A  n: d$ q  `
1 R+ s7 t5 @1 c/ e4 d5 ^
Apple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。8 @- B4 p4 j9 g5 ?2 I

  E$ `, x& m6 M. X. ]9 @5 b2)StartService(), StopService(), RestartService()
, t( W; `( Z: u& o, B) |, l/ e2 N. Z: x* v$ ?; Y
当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。9 H7 E6 O% {: r" [

# m  v0 Z$ n. C) A7 G, Z参数含义:, m2 P0 o) g8 t. o2 `
' o; Q5 P. I8 `2 Q. g8 E7 _* _
start:开机过程中开启服务;
7 C; U6 W; E3 O  P7 v
7 `6 e  k2 L: b( Y# o8 pstop:关机过程中停止服务;
$ c8 N5 Y- p; ~1 F
6 [2 x" C# w2 ]- ]% prestart:在特定条件下重启服务。4 f) T8 D3 m: O! m
( Z; q" C  P  h. Y  S" |: d
3)RunService  “$1”3 R: u  H$ J$ Y& v
6 ~( B4 e5 E1 m* t! M' Y
执行传递给该脚本的第一个参数指定的服务。, y% @# Q4 w) s% A" d* E8 \

) Z. n! x+ _3 Q+ ?“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。+ a1 m% ^/ q6 Z$ E1 m  ?" q- d

$ p9 r) m7 i  O$ [7 f3. Launchd Daemon" u' @* \+ Z/ y% O
launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。
. |% M; r6 l$ b
  H2 _% L$ U! Z采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。
: \9 H- S2 f& S# r* T2 t; B) Q% F$ i3 y( [
3.1 plist文件格式及每个字段的含义:
: [9 N+ L7 I2 R7 b9 d5 r# S( }$ h8 S& v( U& b) l; K8 R* j/ }7 a
5 n0 b& b! f" h+ ?; {4 d. v: e$ e
1)Label【required】& ?5 [' D3 C1 |! L

5 l+ C2 R, }3 @. V6 `7 F+ Q该项服务的名称。
5 _  d* I5 I* K' q8 {
4 h, N5 \- q/ j8 X2)OnDemand【optional】: ^4 I( ^/ b$ t! D3 M9 _" D( x- R

7 p- A4 i. I0 U! e10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。9 d5 h' M/ k0 L2 u, j% o1 d
/ e* t: I- x/ [9 ~/ u& b# m! Y, Z
3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】, C/ g2 f& F  V0 `! g; I

! x# q( [- c5 V6 T指定可执行文件的路径。
; o5 o+ |+ ?) U
. F6 ^% G" k# S% r0 h8 _4)RunAtLoad【optional】0 S! \" P6 p0 d4 U

' a  I1 f. w; F标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。, C! `, y: R% u0 `. B

6 Z  M. W& ~3 j: B6 U) L$ V5)WorkingDirectory【optional】- ~5 ?2 l! z, A& o5 `4 C

- J0 V% B$ N% `- c1 ?0 [该key在开启可执行文件之前,指定当前工作目录的路径。
' c. l' t* }" {, O- K' u# x
; P5 S4 \, D2 @7 a6)KeepAlive【optional】: h% _0 D& z+ c, Y" T0 N' C% j

. L  `" k  }& g# {# i8 s这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。  Q8 W& ~) B4 P, ?
* {+ M4 E/ [" S8 a7 M: f+ N
3.2 创建一个plist文件:
# ^3 @4 P' G& ?# [<?xml version="1.0" encoding="UTF-8"?>2 i  I* t- U  Z! a6 G# b* f
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
3 A1 G- J3 x4 Q    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
; V3 p5 k, ~* V* i1 o: N" x  n4 U<plist version="1.0">
( `6 `; M* [! {3 x<dict>2 w! s( w4 n7 d
    <key>Label</key>
* e5 H5 X- @. C" w# N0 ]5 c        <string>com.yourcompany.HSPA_USB_MODEM</string>) {+ X5 X+ D6 x2 X$ d
    <key>OnDemand</key>
2 X% d) ^' g+ Z$ \3 M. x        <false/>
6 y% _. F2 z9 x# C    <key>Program</key>- _6 l' K  ?0 k: E/ ~  D
        <string>/Application/HSPA USB MODEM.app/Running</string>
: C/ t* O( ^0 X1 \4 |    <key>RunAtLoad</key>
: @; D: Z/ p  H1 H3 y        <true/>  V  }9 w4 Q5 y$ F4 f
    <key>WorkingDirectory</key>- ?* ^' m3 Y7 w
        <string>/Application/HSPA USB MODEM.app</string>
' a. ~1 X2 |$ ]8 T</dict>
1 z2 g7 _; g+ B+ Z! y  R</plist>" ?* k; r3 d" g7 M% |9 M5 W
4.三种方式的区别
/ \* p9 f7 Y/ s  ^9 \8 ?初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。
/ u4 t! d! M( D( D+ c$ c+ a! }! m4 A. s" r
总的来说,LoginItems 和StartupItems的区别较明显。: x! P) g9 w% ?8 ?% D1 c& k! i- D, _
+ \% n7 U' j- ~8 @& M8 d$ k) Q

  p7 ~  R1 P( w( S6 D& c对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。
, ~' A. Z  m4 e1 u, m$ v9 [
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 15:00 , Processed in 0.055496 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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