ChinaFAQ论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1024|回复: 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。
5 Q" T5 p: r2 ^8 x3 Z6 ?0 h) ^7 k# M! Z: G7 ^9 R, t( o8 C
1.Login Items
$ x% V: B7 \& \$ F) d7 J打开System Preferences,选择System -> Accounts,选择Login Items选项卡,将/Applications目录下的.app直接拖进右边的列表中。重启电脑之后就会发现列表中的程序在开机之后就自动启动了。- m3 a& f* L6 F

( y: z9 h4 p1 C+ G- ?" e; l. E8 U7 \; u( j

# N1 W4 P' s3 a2 y# s3 `8 N2.StartupItems$ w# X3 o$ ?. ]8 t' ]& C
StartupItems,顾名思义,就是在系统启动过程中运行的程序,它们可以是运行完就立即终止的程序(比如,开机清空废纸篓),也可以是一直持续在系统运行周期的后台进程。1 e( T/ T+ u5 h$ \# A% g" ?

4 k* f( f/ s% R: t- WStartupItems一般存放在以下两个路径下:: Z3 Q! H# h& k" [# ~9 P

# W! S0 I1 J* A1)/System/Library/StartupItems' q6 A9 ~! k! g. h( M
0 W% l8 h6 o: |* v0 n/ v
2)/Library/StartupItems
9 v. {) j" }* X7 E- C, `$ L8 ?6 n* C' W. g4 |5 N
大部分与系统相关的StartupItems都放在/System/Library/StartupItems这个路径下,它们会先于/Library/StartupItems路径下的执行,因为前者路径下的StartupItems提供了系统级的基础服务,比如crash reporting,core graphics services,system accounting等,而后者路径在默认情况下是不存在的,需要自己手动创建。- _6 g; Y& E% {8 q0 Y
0 n* b  h1 n- `0 V1 [" m
这里我们以/Library/StartupItems目录下的IcebergControlTower为例。
3 B0 O7 ^9 F4 P
' J, b! l% D7 `) W/ b4 E. H$ ^3 Y4 A( @' q& U) V

/ N, Z9 Z* x- Y# V; z/ ?1 h简单来说,在Mac OS X上,一个StartupItems包含以下两个方面的内容:* v2 o" H! L2 k/ d6 H2 g/ u( V
1 B# l* u, n5 e2 A! ?
1)可执行程序;
4 O' o8 k* g. V- I& b0 K" S0 w( J* K6 F
2)包含依赖进程关系的plist文件(StartupParameters.plist)。
8 ?' A4 B7 u. N, d) X  H+ C9 a6 A' i6 }- m
2.1 The Property List# C, J  w# Z6 f
2.1.1 Plist的key值与含义
. l: n6 B- H0 I0 j+ B8 N9 B( @6 z) i/ BStartupParameters.plist 是一个属性列表,包含了运行可执行程序的必要条件。
" Q+ |# G8 W) r5 O$ O
3 O* a- l* O$ N2 f' S' }$ U( P0 f& [- V9 M
7 `, ^; W) a3 X# t  X- x$ S
该plist需要获得root权限,包含了几个方面的内容:
# S) G4 L' x* ^7 `# d, U
# n9 q; _/ [, M6 y* W1)Description;
' [4 T+ N, f$ A0 b5 c# ]3 _
/ N- d1 ~, D6 Z5 f* h% s# R- c      对该服务的一个简单的描述,仅仅是描述,并不是说明实际的进程名称。
% @) U- F% W2 R. o  J% P
! u% D/ n/ M" j# }2 k! C2 G2)Provides;! z3 P& g9 \, u5 V
& |1 r  J' K. l- j7 }/ e' n, _
      指定StartupItems提供的服务。如图plist文件Provides中说明,StartupItems开启的后台进程名为:Iceberg Control Tower。' C$ e# m, Q) q- f* q' E" H6 V. H
2 t& h* _* s( D; e; w& o$ ]% p$ A
      Provides可以指定多个服务,反映在图中就是Item0,Item1…等。这里只有Item0。
% ~+ H! N% `# r8 P0 a" B4 h* K- Z& C2 G+ A$ T
3)Uses;
. E0 c- j' Z" L; [# f" @# N
* }& d: f4 g: l9 \$ J     指定了在StartupItems加载之前需要开启的服务。Mac OS X系统先尝试着加载Uses中指定的服务,然后再加载StartupItems。也就是说,即使Uses中指定的服务没有加载成功,系统仍然会加载StartupItems。5 C( C* b; v, `. A

2 O" D9 b4 e5 x, [4 h4)OrderPreference;' F. @9 w! W3 s; m2 C1 S  s

( m5 l4 J0 w8 ?7 A! a# w     指定执行StartupItems的时间顺序。这个顺序的重要程度排在Uses之后,是指定执行完Uses之后的顺序。可能的取值包括:First, Early, None(default), Late, Last。
1 V# g8 N6 ?! i# H1 x2 v1 W0 h( ?& |. ^2 y2 P) a4 X6 B$ d" A: m- l: a
5)Messages。* J( n/ E# C% Z% o; L" M
* b+ @* N! j. m! L6 u4 m: A0 _
2.1.2 创建一个StartupParameters.plist文件; y$ r+ h4 l: O8 g8 K
<?xml version="1.0" encoding="UTF-8"?>
1 }2 d/ l' {' |: L# a) _<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" % J; q  W/ o* c; b
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">+ r0 Z' {2 I; p. ]- C5 U
<plist version="1.0">* h9 ?- R8 W& I4 w: f* l
<dict>
& \' v2 N6 B+ N& V/ `3 i$ x    <key>Description</key>
+ n6 G$ N3 \! G        <string>Iceberg Control Tower Initilaization</string>
! ]5 _9 }* u; D    <key>Provides</key>
" C4 R& b0 @" f# w8 V' i5 d        <array>. p$ [. X$ v2 e4 r9 @+ w" t
            <string>Iceberg Control Tower</string>
! d( {9 s7 c1 H. e        </array>% T) g/ V3 T2 ]* S" [7 M4 N
     <key>Uses</key>
+ L" H1 ~2 Y4 t% u/ q! P$ [2 ]' o        <array>
: g  R5 D) H  P: J% f# b            <string>Disks</string>
! `6 X( g9 X/ v) W, l" ?        </array>1 J& x7 @$ {2 q1 k0 ]0 ?
    <key>OrderPreference</key>
1 i; ~# J, @. O        <string>None</string>% N2 C3 S2 |6 P
</dict>
* g- q9 K0 l5 W# ?& n; b% t' D3 ]</plist>
- y) }% S. F. m& X. |( x5 y, x* E1 Z, R
3 T* w( H, e' A2 F9 r

0 B2 L# @4 k# c6 c; t2.2 The Executable File# \# }& ^1 K$ f% ^2 j/ I: ?( \
注意:1)可执行文件的名称和它所在的文件夹的文件名是一样的,这是系统默认的规则。
+ c; Y- h* [$ g5 M* a; {+ V( k7 C* s! C& x* T6 `1 x% @7 X7 C
      2)操作可执行文件需要获得root权限。
1 G8 z$ R$ M  t- }
- v$ {* b* l9 L8 B      3)可执行文件是一个shell脚本。
3 A7 ?8 @6 M9 n! x, X& y7 {  j
" |  Z: P; q" d6 a# Q打开IcebergControlTower文件目录下同名的可执行文件,可以看到脚本的具体内容:/ p( w1 [0 ?6 n+ t- D5 |5 c
' W/ \. v6 P  |* v. L8 N
( J& c! a: c, d! M
0 m2 Q% o1 L( I, H  p1 }
一般的可执行文件包含这样几个方面的内容:- _8 `& _* D& L/ D4 e1 P
6 Q0 _! Q1 C6 P1 X
1)./etc/rc.common0 S: _1 d) L# _; W# T! ^
4 b5 V6 s; y. S1 D( ~' u( k
Apple提供的一个脚本库,该脚本库里包含了为可执行文件引进参数的接口。在这里load这个库主要是调用RunService。
* M  F9 T. x3 `4 \/ ^* d; g4 _* d2 ?$ {/ d4 R
2)StartService(), StopService(), RestartService(): S( Y+ [! U( K3 {
/ R5 K( Z. S+ W5 @$ P" v4 q( D% |
当可执行文件接收到的参数为start,stop或者restart时,执行相对应的函数。1 U9 A4 Z7 c: S2 h8 E' L

; y, ^7 z8 M2 b1 P$ @参数含义:) l3 W9 N, D; D
& D# |4 B  p0 p& }$ x% h
start:开机过程中开启服务;8 \( ^  j# e) Y, E

' j; q+ c' O8 n+ q/ ^% D( W& @stop:关机过程中停止服务;
8 o. q" b, u; O& x% e6 V* N8 B  @: ~
restart:在特定条件下重启服务。
# E) D- q; m+ h! R, Y! O, I! \- C0 L* g
3)RunService  “$1”) v  \$ C$ d" ?4 U  o
. k2 U$ y3 @6 u* F; a" T$ F
执行传递给该脚本的第一个参数指定的服务。
7 _( s/ c2 o* V) a! w, p
" r9 e/ \0 C# v+ A“$1” 表示传给该脚本的第一个参数。例如,传入的参数为start,则执行StartService()。
* g8 D, H' w1 o  r. l9 [7 A! u
; Y% y0 t$ l& D: g3 M% `3. Launchd Daemon+ n. A* y0 [1 s; J
launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。
# }8 t/ c5 H& Y7 @$ u$ q9 V
1 l5 E: \$ ~/ [/ {8 C& t, A$ q采用这种方式来配置自启动项很简单,只需要一个plist文件,通常(同时也是系统推荐)是将plist放在~/Library/LaunchAgents路径下。
. ]# H- q, ?0 g" s& S1 n. r' r0 I6 e) D" {7 b( V% v. @. K# v& x
3.1 plist文件格式及每个字段的含义:7 M3 C$ b" h" ?

; l6 g: t0 S7 K' C
& k2 F  f( y9 _1)Label【required】. ]2 N6 |3 _& I' a0 z6 }% \4 [
. ]# m7 W% w5 s. M+ c5 ^) q" c
该项服务的名称。% i0 }2 u$ ?% L7 [) {7 }

2 e: e+ d7 Z0 }8 Q2)OnDemand【optional】
' ?0 H- z4 L9 ]; T  r
) y. k( f* n$ I- I$ p" Y7 l10.4提供的一个key值,功能与KeepAlive的基本功能相似,在10.5及之后的系统中被KeepAlive替代。KeepAlive扩展了更多的功能,除了使用单一的boolean作为key值之外,还能使用字典结合多个key值。
  j3 p" n) K' p/ }$ Q0 J) z, ^3 [* F; X5 Y
3)Program【ProgramArgument是required的,在没有ProgramArgument的情况下,必须要包含Program这个key】
7 f+ X) ]6 F$ C5 w4 v7 g& d2 B/ y7 `
指定可执行文件的路径。
2 h2 f' u9 `) G" o' D1 p5 K4 E- y
1 ^+ _. D; g0 O; r. K- Q4)RunAtLoad【optional】
* x) I2 I! \/ Z" {7 a
8 ^! I" O$ U( O1 G8 W2 Z6 P* _% W6 f标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。6 _" O" Z% Q; ^6 c( h& M

$ ?9 `" g0 o# `( o4 B2 S5)WorkingDirectory【optional】3 N  y" G* ~) a+ H( _9 c5 A  D

( P# ?1 [' v# [; ^该key在开启可执行文件之前,指定当前工作目录的路径。
& `8 W8 p5 j5 z" M* B8 [3 i6 z0 _9 L  }" N( a
6)KeepAlive【optional】, u2 I; L/ x& X; }" j: S( p: Q" {/ @5 y
8 }; u$ h' i. }6 n
这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。  D6 S! `9 G+ b

1 ?# T6 |7 E8 u- ~+ I, C7 y# i2 @3.2 创建一个plist文件:4 k+ d+ `( i+ m
<?xml version="1.0" encoding="UTF-8"?>
# H9 r  s3 ^! ]0 `2 l<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" ( W& @3 e9 Z, C7 i5 s
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">* K4 K, V/ Z: w3 E4 V! ?
<plist version="1.0">
+ B/ ], b% t" ?<dict>
. W' g# y8 R! d- J    <key>Label</key>; m7 ]# ~: `0 q1 V0 R4 b( r
        <string>com.yourcompany.HSPA_USB_MODEM</string>
8 U1 y! Q" s- o) i" A    <key>OnDemand</key>
1 p  x6 U: n3 C5 z        <false/>" r7 b3 }: u, M9 b
    <key>Program</key>% ]. X; s0 w" j* m
        <string>/Application/HSPA USB MODEM.app/Running</string>
3 j) Q4 V8 W6 q/ m    <key>RunAtLoad</key>
- V7 c5 w/ D, j; Y6 E        <true/>4 E7 d7 e* H- v, [9 S8 B
    <key>WorkingDirectory</key>) Z& N7 @2 i, N+ b# n& J) h
        <string>/Application/HSPA USB MODEM.app</string># P3 y; N0 D& \5 K) ^
</dict>
8 p0 u4 X: U6 e% O( T. ~& P9 s</plist>( C. a" o8 P* ?
4.三种方式的区别; {6 l2 k2 i/ Z2 n. p6 [
初步了解了系统的启动过程之后,再来看这三种配置启动项的方式,就很容易理解这三种方式之间的差异了。
- C/ c  L* a' H
8 q* B8 c! @/ N1 T6 e总的来说,LoginItems 和StartupItems的区别较明显。3 y3 T$ a. t9 i( K& A

+ Y0 m4 m& l4 ~1 j% L3 _4 b$ V4 }4 A% ^
对于我们自定义的Launchd daemon,通常(同时也是系统推荐)是放在~/Library/LaunchAgents路径下。launchd进程需要在用户login之后才能加载。这种方式与LoginItems最大的区别在于,启动的进程不同。LoginItems是通过loginwindow去启动的,而Launchd daemon是通过com.apple.launchd.peruser启动。# L; @8 @4 `! G: ~7 d/ V0 K
快手ID:ChinaFAQ-CN
QQ:25338
微信(WeChat):25338

QQ群:874864634
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 19:34 , Processed in 0.097370 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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