ChinaFAQ论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1064|回复: 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。& P) E" t0 J' \
# s! V& D" x* t# Z6 R( E8 ~) Z4 x' S
1.Login Items
+ _+ g) h7 L6 [) ?# U- h' ]打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。- K% D" K4 z( }+ q4 E/ t9 Z

" b, u0 E5 N/ x! i2 e, J. g+ `9 c4 o3 {. t
6 o0 `# w( o) k+ ~% o
2.StartupItems
7 h& b9 x6 E2 r8 n; _StartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。3 T# N5 x( ~5 P4 E" L
  X9 H' o  X  s
StartupItems一般存放在以下两个路径下:
) B, R4 a0 j. f/ [( S
. @3 B& C, Q( Z  P1)/System/Library/StartupItems- f  M! E3 k4 z9 Z/ ~, l; N7 P4 i

* ?" E) v3 V) J( z) B1 ^  }2)/Library/StartupItems
! b- R8 y* v7 A3 i+ J8 c( x$ T) `7 u1 y
大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。
: f1 i5 Y+ l* \# ?- r/ W. ~
2 o- V$ V: c+ |* J) W! {0 t4 R这里我们以/Library/StartupItems目录下的IcebergControlTower为例。
1 j$ k$ V- Q, U1 M' S0 r! \- J0 @" V1 ~3 k2 e

. o; j! }8 b& Y3 ]0 p$ B
/ h5 R5 l9 W) k8 K简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:' d% I9 A+ O/ G2 _9 _
) Q2 f; y" K% k" H4 l0 _' V
1)可执行程序;5 @1 m' N1 I: d0 B/ e% _

1 j/ e8 i! E: T4 ]- ]# _( }4 ^2)包含依赖进程关系的plist文件(StartupParameters.plist)。
: X) o) f# N6 s
. Z+ M+ A# `/ N3 I) {6 y; O8 q/ ]2.1 The Property List, E. _) I$ ?8 U% n
2.1.1 Plist的key值与含义
8 K7 Y% B) e3 OStartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。9 \+ g9 P" K: w4 P6 L

4 d' w- ^/ a  o
4 c6 [" R  ^: ~
8 F6 f. W) I  ~2 R7 {/ N该plist需要获得root权限,包含了几个方面的内容:2 @, W& a3 @! c. W) Q6 j$ i
( k4 ]; j0 ]' ]7 v+ ]
1)Description;
+ B  X7 H2 F% n9 h6 s+ [& I
' |: A2 q4 a  \( V+ s, \; i' o      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。  C0 }" o6 L' l% [
4 H" K8 w) |5 h
2)Provides;
  ?) f) w. Z3 q) g. g9 e% }7 K6 V. t& l/ D4 C5 N( _  z
      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。1 I# K: K" A; ~, m/ L, L) o8 q$ H

# e* H' G3 q: L; N      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。
8 @& l4 z( [/ O; x5 O& ~5 C- i$ }: T
3)Uses;
5 U$ f% ^# M3 s7 Z+ E2 u! [1 O( L
5 L& I' h$ W# r0 v! x     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。% F- `+ s; ~# P7 k9 n
/ j! ~0 J7 c9 W
4)OrderPreference;
6 ?& F' {- t5 D* F1 n3 ~/ |# o) U4 ?# E0 r- a( B# ]" R( {
     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。
' S: A! v/ t" o5 m# k- P% L6 n' x& i8 U; p& r4 O0 v
5)Messages。8 N- j9 Z* P1 v. d9 a1 o, X2 w5 P

* F4 m! P2 k4 Y5 h/ D! ^3 W7 R2.1.2 创建一个StartupParameters.plist文件! Q7 ^0 A: D" X2 I& o" P
<?xml version="1.0" encoding="UTF-8"?>+ V$ J5 o  i5 o$ D' _
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
) z# R/ ~! C7 \+ J    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
0 L) i9 d: W/ X  E3 @& a: [/ q<plist version="1.0">
, d  n( k- ]9 M, i( n/ @; ^<dict>
% m6 \* K% R" A; P4 Z4 a. E    <key>Description</key>
1 x" J( O/ y6 l5 S+ I" u        <string>Iceberg Control Tower Initilaization</string>
, J5 ]  ?: S# W    <key>Provides</key>2 w$ H& d# r  S" s
        <array>
8 h4 [# g3 g( Q3 \# H            <string>Iceberg Control Tower</string>
1 ^. G8 n; Z5 a; `' R9 ?        </array>, y6 {$ f$ {- Z7 b! w; e
     <key>Uses</key>8 Y1 H! ]+ N, p& N
        <array>
8 D# P$ H* |8 m1 }6 Y: G            <string>Disks</string>
& J8 r+ X0 t. g# b8 O+ e. g- i        </array>
2 u1 o0 V$ K8 Y, q# _* H    <key>OrderPreference</key>
0 C% D4 J" ?' e8 y/ q7 P: L        <string>None</string>
' d7 y' [2 w  l* D</dict>/ Y% v- G; J) h- J
</plist>; a. l1 V" E" C: _) k
% @! D5 x  A; Q$ d2 Y  F* L

! l& G- L! |1 u. }% k
0 w" H4 n2 \1 }3 l+ M0 S2.2 The Executable File
3 f' u/ ?. j+ d  ]/ @' S注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。- b4 r" q4 r' v. |! c: \" \

3 m; @9 {+ x: N2 _      2)操作可执行文件需要获得root权限。
5 N1 y1 C. \+ P/ Z9 X8 |: t6 n& U9 t% f2 J- f) C
      3)可执行文件是一个shell脚本。- O* r& `0 p9 q. k% H4 Q. T

) M! `  S) @+ u; Y9 i' o打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:
0 n2 [6 d% U. x  R7 A4 N: v5 E* }# ?' ~
$ i2 W. N7 O; G* O& {: U/ t% ~6 |& n

& G& C8 c& k/ H5 a9 ?7 w一般的可执行文件包含这样几个方面的内容:
" @; q" s1 O4 @: q% r" c" O$ `/ _" F8 W9 k( m! J
1)./etc/rc.common
$ K1 |  r8 p( H( Z$ b' Q. L, Y  k
1 o& F1 f- b. j: l3 v/ i" ^. O; D$ pApple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。
( v. o( N' q" b& x+ ]4 w" W% R: a5 ]2 g* B$ `% L5 }
2)StartService(), StopService(), RestartService()+ U/ U4 z. T/ m8 w
6 ~4 Y6 U2 w" J$ o7 O8 S+ m* ], m: B
当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。% a* Q, v% f1 F  G! I5 f) d

8 O9 {6 v8 K. H1 ]: O参数含义:
+ {4 K  c4 X. T% [$ L4 o5 P- O( @' ]
* |" N  S+ f2 _! z$ vstart:开机过程中开启服务;1 ]- D& |: M1 p4 b) R1 N2 ]' ~

1 N. L5 O( n0 f/ g; Dstop:关机过程中停止服务;" _1 z6 ]8 ^$ t  ~6 j

/ G; l' ^2 g1 F, q2 P' Wrestart:在特定条件下重启服务。. F: D/ L. {$ {( B( |7 ]8 h% ?5 L

0 r; i  h6 f3 p, e& ]8 E3)RunService  “$1”
6 J: f6 c, C' C8 z7 s5 z" C) C
1 n+ W' U, }7 ~; f/ ?2 `7 t; q执行传递给该脚本的第一个参数指定的服务。
2 Y6 B+ n+ J1 S  h! n  B
0 {% {2 \# Z! g' |5 p“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。
% y3 `+ r  u2 X! U3 `
! ~1 G. R/ Y: _+ U2 z6 w3. Launchd Daemon8 r1 k) ^3 D: s1 M( s6 C8 t
launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。
1 d( @3 a5 b) a' k+ v, Y8 U) `. Q- T* x# Y% h/ \; m( w' b
采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。& D, K7 R, X/ _. _/ p
2 e2 E; @' T( Q
3.1 plist文件格式及每个字段的含义:
9 t: Z% ~! E: Z6 g, k/ x
& L! H! a9 z+ e
& z. t: a' z/ a/ ?& M: b1)Label【required】6 J! {! l3 g3 l3 X1 z% ]  T
6 Q- i4 Q: |  C5 o! V; s6 ]
该项服务的名称。
+ h9 }& u7 R, ]5 p4 L0 E6 l9 m4 \; t  K+ g: n3 C1 x5 v! q3 Z
2)OnDemand【optional】
: B# w- S) ^; u2 B9 `4 d
, j+ Z  {  u7 ^10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。7 S# c; U$ J8 V+ k" o6 Q
2 j# |0 b7 Y, z  G0 N% M% b
3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】2 Z( o0 q% l: u! J! v, C
7 d, y. s9 {+ t; e2 E1 V9 {8 b. U
指定可执行文件的路径。- n. y* r# A( T9 B* x

1 j" r8 o6 @8 p0 c4)RunAtLoad【optional】
! f' P# a6 n* f5 d8 \/ i& \5 C) ]8 _/ M- q" o3 {! `
标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。
! H4 J9 M! Q0 G, p4 L% H3 ]: R! n. t2 A- T1 ?
5)WorkingDirectory【optional】
% I6 v- k7 E8 g
, W2 D" t, `! v8 y: i( K该key在开启可执行文件之前,指定当前工作目录的路径。/ U, l  i4 q  _1 }5 B' z+ C5 r

* D% i1 g4 E, M+ I+ l6)KeepAlive【optional】
. i4 ?, Z+ S: o; M2 W0 e) o) l
2 K, v/ J- E; b: G7 i* {0 X' g" B! v7 T这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。) o9 b% y- [, ~8 n+ T8 p# m# i

0 i7 Y+ b7 y' y2 ?3.2 创建一个plist文件:
( l" S, z0 P; r! P6 o% b& }<?xml version="1.0" encoding="UTF-8"?>
. d" ]; e' b4 B. p9 Z9 A; C9 c<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
9 H$ F9 n: d& M$ E    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">+ E1 b; I, s  M" U
<plist version="1.0">6 |; S' w" l9 ?; N8 i: o+ P0 R
<dict>' x; x: k& N1 M% T
    <key>Label</key>
, t% F" z4 W& I9 T# `' F8 H  m( G        <string>com.yourcompany.HSPA_USB_MODEM</string>7 w1 z  ]0 n  [+ b4 v9 J2 c: j+ k! j
    <key>OnDemand</key>
2 ]  U1 o9 i3 X1 o& r5 {9 n. r# |& d        <false/>! u9 z( C! w* }2 j9 p, L! K& P
    <key>Program</key>
2 l6 j! @2 G( K4 h- _' d/ v) C9 N) H/ |        <string>/Application/HSPA USB MODEM.app/Running</string>
; N3 W/ S$ d8 D: @, S. ^    <key>RunAtLoad</key>+ i& _* [6 i/ W. E* r4 t
        <true/>' ]) k  q1 }) x0 a, t9 V
    <key>WorkingDirectory</key>
- e" P" e# p- N        <string>/Application/HSPA USB MODEM.app</string>
( d. \* J  p- I& f0 i/ [</dict>
  q. L2 L& ~% K& b4 c& F6 |: P" m</plist>
( q5 e; o) t7 H9 N$ [) W4.三种方式的区别
8 m9 T- F. D7 y7 l! R+ ]6 ]4 m% f初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。
' r  ~- L9 l* T1 i
. z- H3 \& ?5 j6 `! H6 t总的来说,LoginItems 和StartupItems的区别较明显。
* j/ m) A" q6 Z$ h  j$ X# j3 x- X9 x% }4 U- C: }
8 S) f+ j, S8 ~, V$ M
对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。( E: b  s6 C; L" `2 H
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 07:27 , Processed in 0.096226 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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