天天看點

Linux Shell之init腳本與activemq init腳本設計亮點分析

init腳本通常具有如下特性:

1.使用系統自帶的預定義的init函數,這一套函數通常在一個檔案中,根據不同的linux發行版本檔案的位置和内容也不一樣,例如ubuntu下是/lib/lsb/init-functions以及/lib/lsb/init-functions.d/下的一些子檔案,centos下是/etc/init.d/functions。

2.參數靈活配置,既可以在init腳本中設定可變的腳本參數,也可以引入其他檔案中的配置參數

3.嚴謹的判斷邏輯,幾乎能捕獲并處理所有的異常,例如函數與指令的傳回值檢測、檔案和執行檔案以及參數是否存在的判斷,甚至是否是softlink檔案也考慮在内

4.良好的可管理性和可移植性性,可管理性展現在針對某一服務或程序多種操作,可移植性展現在将此腳本移植到其他相似系統上照樣可以執行或者隻需要少量的改動就能運作,例如一個更友善的例子,手動編譯安裝的nginx、httpd等可以直接利用yum或者apt-get安裝得到的init腳本,改動一下安裝路徑做一下檔案連結就可以用了,省卻自己編寫init腳本的麻煩

下面是activemq的一個init腳本的例子,該腳本有四大亮點:

亮點1:沒用使用系統提供的init公共函數;

亮點2:正确處理softlink invoke可能導緻的異常;

亮點3:自動導入(生成)配置檔案,而且是從自身導入

亮點4:支援多執行個體部署,通過不同的配置檔案實作多執行個體運作

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

492

493

494

495

496

497

498

499

500

501

502

503

504

505

506

507

508

509

510

511

512

513

514

515

516

517

518

519

520

521

522

523

524

525

526

527

528

529

530

531

532

533

534

535

536

537

538

539

540

541

542

543

544

545

546

547

548

549

550

551

552

553

554

555

556

557

558

559

560

561

562

563

564

565

566

567

568

569

570

571

572

573

574

575

576

577

578

579

580

581

582

583

584

585

586

587

588

589

590

591

592

593

594

595

596

597

598

599

600

601

602

603

604

605

606

607

608

609

610

611

612

613

614

615

616

617

618

619

620

621

622

623

624

625

626

627

628

629

630

631

632

633

634

635

636

637

638

639

640

641

642

643

644

645

646

647

648

649

650

651

652

653

654

655

656

657

658

659

660

661

662

663

664

665

666

667

668

669

670

671

672

673

674

675

676

677

678

679

680

681

682

683

684

685

686

687

688

689

690

691

692

693

694

<code>#!/bin/sh</code>

<code># ------------------------------------------------------------------------</code>

<code># licensed to the apache software foundation (asf) under one or more</code>

<code># contributor license agreements.  see the notice file distributed with</code>

<code># this work for additional information regarding copyright ownership.</code>

<code># the asf licenses this file to you under the apache license, version 2.0</code>

<code># (the "license"); you may not use this file except in compliance with</code>

<code># the license.  you may obtain a copy of the license at</code>

<code>#</code>

<code># http://www.apache.org/licenses/license-2.0</code>

<code># unless required by applicable law or agreed to in writing, software</code>

<code># distributed under the license is distributed on an "as is" basis,</code>

<code># without warranties or conditions of any kind, either express or implied.</code>

<code># see the license for the specific language governing permissions and</code>

<code># limitations under the license.</code>

<code># this script controls standalone apache activemq service processes.</code>

<code># to ensure compatibility to macosx and cygwin we do not utilize</code>

<code># lsb standard infrastructure for controlling daemons like</code>

<code># "start-stop-daemon".</code>

<code># see also http://activemq.apache.org/activemq-command-line-tools-reference.html</code>

<code># for additional commandline arguments</code>

<code># authors:</code>

<code># marc schoechlin &lt;[email protected]&gt;</code>

<code># configuration</code>

<code>activemq_configs=</code><code>"/etc/default/activemq $home/.activemqrc"</code>

<code># backup invocation parameters</code>

<code>commandline_args=</code><code>"$@"</code>

<code># for using instances</code>

<code>if</code> <code>( </code><code>basename</code> <code>$0 | </code><code>grep</code> <code>"activemq-instance-"</code> <code>&gt; </code><code>/dev/null</code><code>);</code><code>then</code>

<code>   </code><code>inst=</code><code>"`basename $0|sed 's/^activemq-instance-//;s/\.sh$//'`"</code>

<code>   </code><code>activemq_configs=</code><code>"/etc/default/activemq-instance-${inst} $home/.activemqrc-instance-${inst}"</code>

<code>   </code><code>echo</code> <code>"info: using alternative activemq configuration files: $activemq_configs"</code>

<code>fi</code>

<code>## start:defaultconfig</code>

<code># configuration file for running apache active mq as standalone provider</code>

<code># this file overwrites the predefined settings of the sysv init-script</code>

<code># active mq installation dir</code>

<code>if</code> <code>[ -z </code><code>"$activemq_home"</code> <code>] ; </code><code>then</code>

<code>  </code><code># try to find activemq</code>

<code>  </code><code>if</code> <code>[ -d </code><code>/opt/activemq</code> <code>] ; </code><code>then</code>

<code>    </code><code>activemq_home=</code><code>/opt/activemq</code>

<code>  </code><code>fi</code>

<code>  </code><code>if</code> <code>[ -d </code><code>"${home}/opt/activemq"</code> <code>] ; </code><code>then</code>

<code>    </code><code>activemq_home=</code><code>"${home}/opt/activemq"</code>

<code>  </code><code>## resolve links - $0 may be a link to activemq's home</code>

<code>  </code><code>prg=</code><code>"$0"</code>

<code>  </code><code>progname=`</code><code>basename</code> <code>"$0"</code><code>`</code>

<code>  </code><code>saveddir=`</code><code>pwd</code><code>`</code>

<code>  </code><code># need this for relative symlinks</code>

<code>  </code><code>dirname_prg=`</code><code>dirname</code> <code>"$prg"</code><code>`</code>

<code>  </code><code>cd</code> <code>"$dirname_prg"</code>

<code>  </code><code>while</code> <code>[ -h </code><code>"$prg"</code> <code>] ; </code><code>do</code>

<code>    </code><code>ls</code><code>=`</code><code>ls</code> <code>-ld </code><code>"$prg"</code><code>`</code>

<code>    </code><code>link=`</code><code>expr</code> <code>"$ls"</code> <code>: </code><code>'.*-&gt; \(.*\)$'</code><code>`</code>

<code>    </code><code>if</code> <code>expr</code> <code>"$link"</code> <code>: </code><code>'.*/.*'</code> <code>&gt; </code><code>/dev/null</code><code>; </code><code>then</code>

<code>    </code><code>prg=</code><code>"$link"</code>

<code>    </code><code>else</code>

<code>    </code><code>prg=`</code><code>dirname</code> <code>"$prg"</code><code>`</code><code>"/$link"</code>

<code>    </code><code>fi</code>

<code>  </code><code>done</code>

<code>  </code><code>activemq_home=`</code><code>dirname</code> <code>"$prg"</code><code>`/..</code>

<code>  </code><code>cd</code> <code>"$saveddir"</code>

<code>  </code><code># make it fully qualified</code>

<code>  </code><code>activemq_home=`</code><code>cd</code> <code>"$activemq_home"</code> <code>&amp;&amp; </code><code>pwd</code><code>`</code>

<code>if</code> <code>[ -z </code><code>"$activemq_base"</code> <code>] ; </code><code>then</code>

<code>  </code><code>activemq_base=</code><code>"$activemq_home"</code>

<code># active mq configuration directory</code>

<code>if</code> <code>[ -z </code><code>"$activemq_conf"</code> <code>] ; </code><code>then</code>

<code>    </code><code># for backwards compat with old variables we let activemq_config_dir set activemq_conf</code>

<code>    </code><code>if</code> <code>[ -z </code><code>"$activemq_config_dir"</code> <code>] ; </code><code>then</code>

<code>        </code><code>activemq_conf=</code><code>"$activemq_base/conf"</code>

<code>        </code><code>activemq_conf=</code><code>"$activemq_config_dir"</code>

<code># configure a user with non root priviledges, if no user is specified do not change user</code>

<code>if</code> <code>[ -z </code><code>"$activemq_user"</code> <code>] ; </code><code>then</code>

<code>    </code><code>activemq_user=</code><code>""</code>

<code># active mq data directory</code>

<code>if</code> <code>[ -z </code><code>"$activemq_data"</code> <code>] ; </code><code>then</code>

<code>    </code><code># for backwards compat with old variables we let activemq_data_dir set activemq_data</code>

<code>    </code><code>if</code> <code>[ -z </code><code>"$activemq_data_dir"</code> <code>] ; </code><code>then</code>

<code>        </code><code>activemq_data=</code><code>"$activemq_base/data"</code>

<code>        </code><code>activemq_data=</code><code>"$activemq_data_dir"</code>

<code>if</code> <code>[ -z </code><code>"$activemq_tmp"</code> <code>] ; </code><code>then</code>

<code>  </code><code>activemq_tmp=</code><code>"$activemq_base/tmp"</code>

<code>setcurrentuser(){</code>

<code>   </code><code>cuser=`</code><code>whoami</code> <code>2&gt;</code><code>/dev/null</code><code>`</code>

<code>   </code><code># solaris fix</code>

<code>   </code><code>if</code> <code>[ ! $? -</code><code>eq</code> <code>0 ]; </code><code>then</code>

<code>      </code><code>cuser=`</code><code>/usr/ucb/whoami</code> <code>2&gt;</code><code>/dev/null</code><code>`</code>

<code>   </code><code>fi</code>

<code>}</code>

<code>if</code> <code>[ ! -d </code><code>"$activemq_data"</code> <code>]; </code><code>then</code>

<code>   </code><code>setcurrentuser</code>

<code>   </code><code>if</code> <code>( [ -z </code><code>"$activemq_user"</code> <code>] || [ </code><code>"$activemq_user"</code> <code>= </code><code>"$cuser"</code> <code>] );</code><code>then</code>

<code>        </code><code>mkdir</code> <code>$activemq_data</code>

<code>   </code><code>elif</code> <code>[ </code><code>"`id -u`"</code> <code>= </code><code>"0"</code> <code>];</code><code>then</code>

<code>      </code><code>su</code> <code>-c </code><code>"mkdir $activemq_data"</code> <code>- $activemq_user;</code>

<code># location of the pidfile</code>

<code>if</code> <code>[ -z </code><code>"$activemq_pidfile"</code> <code>]; </code><code>then</code>

<code>  </code><code>activemq_pidfile=</code><code>"$activemq_data/activemq-`hostname`.pid"</code>

<code># location of the java installation</code>

<code># specify the location of your java installation using java_home, or specify the</code>

<code># path to the "java" binary using javacmd</code>

<code># (set javacmd to "auto" for automatic detection)</code>

<code>#java_home=""</code>

<code>javacmd=</code><code>"auto"</code>

<code># set jvm memory configuration</code>

<code>if</code> <code>[ -z </code><code>"$activemq_opts_memory"</code> <code>] ; </code><code>then</code>

<code>    </code><code>activemq_opts_memory=</code><code>"-xms1g -xmx1g"</code>

<code># uncomment to enable audit logging</code>

<code>#activemq_opts="$activemq_opts -dorg.apache.activemq.audit=true"</code>

<code># set jvm jmx configuration</code>

<code># this enables jmx access over a configured jmx-tcp-port.</code>

<code># you have to configure the first four settings if you run a ibm jvm, caused by the</code>

<code># fact that ibm's jvm does not support virtualmachine.attach(pid).</code>

<code># jmx access is needed for quering a running activemq instance to gain data or to</code>

<code># trigger management operations.</code>

<code># example for ${activemq_conf}/jmx.access:</code>

<code># ---</code>

<code># # the "monitorrole" role has readonly access.</code>

<code># # the "controlrole" role has readwrite access.</code>

<code># monitorrole readonly</code>

<code># controlrole readwrite</code>

<code># example for ${activemq_conf}/jmx.password:</code>

<code># # the "monitorrole" role has password "abc123".</code>

<code># # # the "controlrole" role has password "abcd1234".</code>

<code># monitorrole abc123</code>

<code># controlrole abcd1234</code>

<code># activemq_sunjmx_start="-dcom.sun.management.jmxremote.port=11099 "</code>

<code># activemq_sunjmx_start="$activemq_sunjmx_start -dcom.sun.management.jmxremote.password.file=${activemq_conf}/jmx.password"</code>

<code># activemq_sunjmx_start="$activemq_sunjmx_start -dcom.sun.management.jmxremote.access.file=${activemq_conf}/jmx.access"</code>

<code># activemq_sunjmx_start="$activemq_sunjmx_start -dcom.sun.management.jmxremote.ssl=false"</code>

<code>activemq_sunjmx_start=</code><code>"$activemq_sunjmx_start -dcom.sun.management.jmxremote"</code>

<code># set jvm jmx configuration for controlling the broker process</code>

<code># you only have to configure the first four settings if you run a ibm jvm, caused by the</code>

<code># fact that ibm's jvm does not support virtualmachine.attach(pid)</code>

<code># (see also com.sun.management.jmxremote.port, .jmx.password.file and .jmx.access.file )</code>

<code>#activemq_sunjmx_control="--jmxurl service:jmx:rmi:///jndi/rmi://127.0.0.1:1099/jmxrmi --jmxuser controlrole --jmxpassword abcd1234"</code>

<code>activemq_sunjmx_control=</code><code>""</code>

<code># specify the queue manager url for using "browse" option of sysv initscript</code>

<code>if</code> <code>[ -z </code><code>"$activemq_queuemanagerurl"</code> <code>]; </code><code>then</code>

<code>    </code><code>activemq_queuemanagerurl=</code><code>"--amqurl tcp://localhost:61616"</code>

<code># set additional jse arguments</code>

<code>activemq_ssl_opts=</code><code>"$ssl_opts"</code>

<code># uncomment to enable yourkit profiling</code>

<code>#activemq_debug_opts="-agentlib:yjpagent"</code>

<code># uncomment to enable remote debugging</code>

<code>#activemq_debug_opts="-xdebug -xnoagent -djava.compiler=none -xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"</code>

<code># activemq tries to shutdown the broker by jmx,</code>

<code># after a specified number of seconds send sigkill</code>

<code>if</code> <code>[ -z </code><code>"$activemq_kill_maxseconds"</code> <code>]; </code><code>then</code>

<code>    </code><code>activemq_kill_maxseconds=30</code>

<code>## end:defaultconfig</code>

<code># load configuration</code>

<code># load activemq configuration</code>

<code>config_load=</code><code>"no"</code>

<code>for</code> <code>activemq_config </code><code>in</code> <code>$activemq_configs;</code><code>do</code>

<code>   </code><code>if</code> <code>[ -f </code><code>"$activemq_config"</code> <code>] ; </code><code>then</code>

<code>     </code><code>( . $activemq_config &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1 )</code>

<code>     </code><code>if</code> <code>[ </code><code>"$?"</code> <code>!= </code><code>"0"</code> <code>];</code><code>then</code>

<code>      </code><code>echo</code> <code>"error: there are syntax errors in '$activemq_config'"</code>

<code>      </code><code>exit</code> <code>1</code>

<code>     </code><code>else</code>

<code>       </code><code>echo</code> <code>"info: loading '$activemq_config'"</code>

<code>       </code><code>. $activemq_config</code>

<code>      </code><code>config_load=</code><code>"yes"</code>

<code>     </code><code>fi</code>

<code>done</code>

<code># inform user that default configuration is loaded, no suitable configfile found</code>

<code>if</code> <code>[ </code><code>"$config_load"</code> <code>!= </code><code>"yes"</code> <code>];</code><code>then</code>

<code>   </code><code>if</code> <code>[ </code><code>"$1"</code> <code>!= </code><code>"setup"</code> <code>];</code><code>then</code>

<code>      </code><code>echo</code> <code>"info: using default configuration"</code><code>;</code>

<code>      </code><code>echo</code> <code>"(you can configure options in one of these file: $activemq_configs)"</code>

<code>      </code><code>echo</code>

<code>      </code><code>echo</code> <code>"info: invoke the following command to create a configuration file"</code>

<code>      </code><code>configs=`</code><code>echo</code> <code>$activemq_configs|</code><code>sed</code> <code>'s/[ ][ ]*/ | /'</code><code>`</code>

<code>      </code><code>echo</code> <code>"$0 setup [ $configs ]"</code>

<code>if</code> <code>[ -z </code><code>"$activemq_opts"</code> <code>] ; </code><code>then</code>

<code>    </code><code>activemq_opts=</code><code>"$activemq_opts_memory -djava.util.logging.config.file=logging.properties -dhawtio.realm=activemq -dhawtio.role=admins -dhawtio.roleprincipalclasses=org.apache.activemq.jaas.groupprincipal -djava.security.auth.login.config=$activemq_conf/login.config"</code>

<code># create configuration if requested</code>

<code>if</code> <code>[ </code><code>"$1"</code> <code>= </code><code>"setup"</code> <code>];</code><code>then</code>

<code>   </code><code>if</code> <code>[ -z </code><code>"$2"</code> <code>];</code><code>then</code>

<code>      </code><code>echo</code> <code>"error: specify configuration file"</code>

<code>   </code><code>echo</code> <code>"info: creating configuration file: $2"</code>

<code>   </code><code>(</code>

<code>   </code><code>p_state=</code><code>"0"</code>

<code>   </code><code>while</code> <code>read</code> <code>line ;</code><code>do</code>

<code>      </code><code>if</code> <code>(</code><code>echo</code> <code>"$line"</code> <code>| </code><code>grep</code> <code>"start:defaultconfig"</code> <code>&gt;</code><code>/dev/null</code> <code>);</code><code>then</code>

<code>         </code><code>p_state=</code><code>"1"</code>

<code>         </code><code>continue</code><code>;</code>

<code>      </code><code>fi</code>

<code>      </code><code>if</code> <code>(</code><code>echo</code> <code>"$line"</code> <code>| </code><code>grep</code> <code>"end:defaultconfig"</code> <code>&gt;</code><code>/dev/null</code><code>);</code><code>then</code>

<code>         </code><code>p_state=</code><code>"0"</code>

<code>         </code><code>break</code><code>;</code>

<code>      </code><code>if</code> <code>[ </code><code>"$p_state"</code> <code>-</code><code>eq</code> <code>"1"</code> <code>];</code><code>then</code>

<code>         </code><code>echo</code> <code>$line</code>

<code>   </code><code>done</code> <code>&lt; $0</code>

<code>   </code><code>) &gt; $2</code>

<code>   </code><code>echo</code> <code>"info: it's recommend to limit access to '$2' to the priviledged user"</code>

<code>   </code><code>echo</code> <code>"info: (recommended: chown '$cuser':nogroup '$2'; chmod 600 '$2')"</code>

<code>   </code><code>exit</code> <code>$?</code>

<code># os specific support</code>

<code>ostype=</code><code>"unknown"</code>

<code>case</code> <code>"`uname`"</code> <code>in</code>

<code>  </code><code>cygwin*) ostype=</code><code>"cygwin"</code> <code>;;</code>

<code>  </code><code>darwin*)</code>

<code>           </code><code>ostype=</code><code>"darwin"</code>

<code>           </code><code>if</code> <code>[ -z </code><code>"$java_home"</code> <code>] &amp;&amp; [ </code><code>"$javacmd"</code> <code>= </code><code>"auto"</code> <code>];</code><code>then</code>

<code>             </code><code>java_home=</code><code>/system/library/frameworks/javavm</code><code>.framework</code><code>/home</code>

<code>           </code><code>fi</code>

<code>           </code><code>;;</code>

<code>esac</code>

<code># for cygwin, ensure paths are in unix format before anything is touched</code>

<code>if</code> <code>[ </code><code>"$ostype"</code> <code>= </code><code>"cygwin"</code> <code>]; </code><code>then</code>

<code>  </code><code>[ -n </code><code>"$activemq_home"</code> <code>] &amp;&amp;</code>

<code>    </code><code>activemq_home=</code><code>"`cygpath --unix "</code><code>$activemq_home</code><code>"`"</code>

<code>  </code><code>[ -n </code><code>"$java_home"</code> <code>] &amp;&amp;</code>

<code>    </code><code>java_home=</code><code>"`cygpath --unix "</code><code>$java_home</code><code>"`"</code>

<code>  </code><code>[ -n </code><code>"$classpath"</code> <code>] &amp;&amp;</code>

<code>    </code><code>classpath=</code><code>"`cygpath --path --unix "</code><code>$classpath</code><code>"`"</code>

<code># detect the location of the java binary</code>

<code>if</code> <code>[ -z </code><code>"$javacmd"</code> <code>] || [ </code><code>"$javacmd"</code> <code>= </code><code>"auto"</code> <code>] ; </code><code>then</code>

<code>  </code><code>if</code> <code>[ -n </code><code>"$java_home"</code>  <code>] ; </code><code>then</code>

<code>    </code><code>if</code> <code>[ -x </code><code>"$java_home/jre/sh/java"</code> <code>] ; </code><code>then</code>

<code>      </code><code># ibm's jdk on aix uses strange locations for the executables</code>

<code>      </code><code>javacmd=</code><code>"$java_home/jre/sh/java"</code>

<code>      </code><code>javacmd=</code><code>"$java_home/bin/java"</code>

<code># hm, we still do not know the location of the java binary</code>

<code>if</code> <code>[ ! -x </code><code>"$javacmd"</code> <code>] ; </code><code>then</code>

<code>    </code><code>javacmd=`</code><code>which</code> <code>java 2&gt; </code><code>/dev/null</code> <code>`</code>

<code>    </code><code>if</code> <code>[ -z </code><code>"$javacmd"</code> <code>] ; </code><code>then</code>

<code>        </code><code>javacmd=java</code>

<code># stop here if no java installation is defined/found</code>

<code>  </code><code>echo</code> <code>"error: configuration variable java_home or javacmd is not defined correctly."</code>

<code>  </code><code>echo</code> <code>"       (java_home='$javahome', javacmd='$javacmd')"</code>

<code>  </code><code>exit</code> <code>1</code>

<code>echo</code> <code>"info: using java '$javacmd'"</code>

<code># for cygwin, switch paths to windows format before running java if [ "$ostype" = "cygwin" ]; then</code>

<code>if</code> <code>[ </code><code>"$ostype"</code> <code>= </code><code>"cygwin"</code> <code>];</code><code>then</code>

<code>  </code><code>activemq_home=`cygpath --windows </code><code>"$activemq_home"</code><code>`</code>

<code>  </code><code>activemq_base=`cygpath --windows </code><code>"$activemq_base"</code><code>`</code>

<code>  </code><code>activemq_conf=`cygpath --windows </code><code>"$activemq_conf"</code><code>`</code>

<code>  </code><code>activemq_data=`cygpath --windows </code><code>"$activemq_data"</code><code>`</code>

<code>  </code><code>activemq_classpath=`cygpath --path --windows </code><code>"$activemq_classpath"</code><code>`</code>

<code>  </code><code>java_home=`cygpath --windows </code><code>"$java_home"</code><code>`</code>

<code>  </code><code>classpath=`cygpath --path --windows </code><code>"$classpath"</code><code>`</code>

<code>  </code><code>cyghome=`cygpath --windows </code><code>"$home"</code><code>`</code>

<code>  </code><code>activemq_tmp=`cygpath --windows </code><code>"$activemq_tmp"</code><code>`</code>

<code>  </code><code>if</code> <code>[ -n </code><code>"$cyghome"</code> <code>]; </code><code>then</code>

<code>      </code><code>activemq_cygwin=</code><code>"-dcygwin.user.home=\"$cyghome\""</code>

<code># set default classpath</code>

<code># add instance conf dir before amq install conf dir to pick up instance-specific classpath entries first</code>

<code>activemq_classpath=</code><code>"${activemq_conf};${activemq_classpath}"</code>

<code># start the activemq jar</code>

<code># @arg1 : the name of the pid-file</code>

<code>#         if specified, this function starts the java process in background as a daemon</code>

<code>#         and stores the pid of the created process in the file.</code>

<code>#         output on stdout/stderr will be supressed if this parameter is specified</code>

<code># @ret  : if unless 0 something went wrong</code>

<code># note: this function uses a lot of globally defined variables</code>

<code># - if $activemq_user is set, the function tries starts the java process whith the specified</code>

<code>#   user</code>

<code>invokejar(){</code>

<code>   </code><code>pidfile=</code><code>"$1"</code>

<code>   </code><code>ret=</code><code>"1"</code>

<code>   </code><code>if</code> <code>[ ! -f </code><code>"${activemq_home}/bin/activemq.jar"</code> <code>];</code><code>then</code>

<code>    </code><code>echo</code> <code>"error: '${activemq_home}/bin/activemq.jar' does not exist"</code>

<code>    </code><code>exit</code> <code>1</code>

<code>      </code><code>doit_prefix=</code><code>"sh -c "</code>

<code>      </code><code>doit_postfix=</code><code>";"</code>

<code>      </code><code>doit_prefix=</code><code>"su -c "</code>

<code>      </code><code>doit_postfix=</code><code>" - $activemq_user"</code>

<code>      </code><code>echo</code> <code>"info: changing to user '$activemq_user' to invoke java"</code>

<code>   </code><code># execute java binary</code>

<code>   </code><code>if</code> <code>[ -n </code><code>"$pidfile"</code> <code>] &amp;&amp; [ </code><code>"$pidfile"</code> <code>!= </code><code>"stop"</code> <code>];</code><code>then</code>

<code>      </code><code>$doit_prefix "$javacmd $activemq_opts $activemq_debug_opts \</code>

<code>              </code><code>-dactivemq.classpath=\"${activemq_classpath}\" \</code>

<code>              </code><code>-dactivemq.home=\"${activemq_home}\" \</code>

<code>              </code><code>-dactivemq.base=\"${activemq_base}\" \</code>

<code>              </code><code>-dactivemq.conf=\"${activemq_conf}\" \</code>

<code>              </code><code>-dactivemq.data=\"${activemq_data}\" \</code>

<code>              </code><code>$activemq_cygwin \</code>

<code>              </code><code>-jar \"${activemq_home}</code><code>/bin/activemq</code><code>.jar\" $commandline_args &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1 &amp;</code>

<code>              </code><code>ret=\"\$?\"; apid=\"\$!\";</code>

<code>              </code><code>echo</code> <code>\$apid &gt; $pidfile;</code>

<code>              </code><code>echo</code> <code>\</code><code>"info: pidfile created : '$pidfile' (pid '\$apid')\";exit \$ret"</code> <code>$doit_postfix</code>

<code>      </code><code>ret=</code><code>"$?"</code>

<code>   </code><code>elif</code> <code>[ -n </code><code>"$pidfile"</code> <code>] &amp;&amp; [ </code><code>"$pidfile"</code> <code>= </code><code>"stop"</code> <code>];</code><code>then</code>

<code>          </code><code>pid=`</code><code>cat</code> <code>$activemq_pidfile`</code>

<code>          </code><code>$doit_prefix "$javacmd $activemq_opts $activemq_debug_opts \</code>

<code>              </code><code>-jar \"${activemq_home}</code><code>/bin/activemq</code><code>.jar\" $commandline_args --pid $pid &amp;</code>

<code>              </code><code>echo</code> <code>\$apid &gt; $activemq_data</code><code>/stop</code><code>.pid; </code><code>exit</code> <code>\$ret" $doit_postfix</code>

<code>   </code><code>else</code>

<code>              </code><code>-jar \</code><code>"${activemq_home}/bin/activemq.jar\" $commandline_args"</code> <code>$doit_postfix</code>

<code>   </code><code>return</code> <code>$ret</code>

<code># check if activemq is running</code>

<code># @ret  : 0 =&gt; the activemq process is running</code>

<code>#         1 =&gt; process id in $activemq_pidfile does not exist anymore</code>

<code>#         2 =&gt; something is wrong with the pid file</code>

<code># note: this function uses globally defined variables</code>

<code># - $activemq_pidfile : the name of the pid file</code>

<code>checkrunning(){</code>

<code>    </code><code>if</code> <code>[ -f </code><code>"$activemq_pidfile"</code> <code>]; </code><code>then</code>

<code>       </code><code>if</code>  <code>[ -z </code><code>"`cat $activemq_pidfile`"</code> <code>];</code><code>then</code>

<code>        </code><code>echo</code> <code>"error: pidfile '$activemq_pidfile' exists but contains no pid"</code>

<code>        </code><code>return</code> <code>2</code>

<code>       </code><code>fi</code>

<code>       </code><code>pid=`</code><code>cat</code> <code>$activemq_pidfile`</code>

<code>       </code><code>ret=`</code><code>ps</code> <code>-p $pid|</code><code>grep</code> <code>java`</code>

<code>       </code><code>if</code> <code>[ -n </code><code>"$ret"</code> <code>];</code><code>then</code>

<code>         </code><code>return</code> <code>0;</code>

<code>       </code><code>else</code>

<code>         </code><code>return</code> <code>1;</code>

<code>checkstoprunning(){</code>

<code>    </code><code>pid=$activemq_data</code><code>/stop</code><code>.pid</code>

<code>    </code><code>if</code> <code>[ -f </code><code>"$pid"</code> <code>]; </code><code>then</code>

<code>       </code><code>if</code>  <code>[ -z </code><code>"`cat $pid`"</code> <code>];</code><code>then</code>

<code>        </code><code>echo</code> <code>"error: pidfile '$pid' exists but contains no pid"</code>

<code>       </code><code>thepid=`</code><code>cat</code> <code>$pid`</code>

<code>       </code><code>ret=`</code><code>ps</code> <code>-p $thepid|</code><code>grep</code> <code>java`</code>

<code>#         1 =&gt; the activemq process is not running</code>

<code>invoke_status(){</code>

<code>    </code><code>if</code> <code>( checkrunning );</code><code>then</code>

<code>         </code><code>pid=`</code><code>cat</code> <code>$activemq_pidfile`</code>

<code>         </code><code>echo</code> <code>"activemq is running (pid '$pid')"</code>

<code>         </code><code>exit</code> <code>0</code>

<code>    </code><code>echo</code> <code>"activemq not running"</code>

<code># start activemq if not already running</code>

<code># @ret  : 0 =&gt; is now started, is already started</code>

<code>#         !0 =&gt; something went wrong</code>

<code># - $activemq_pidfile      : the name of the pid file</code>

<code># - $activemq_opts         : additional options</code>

<code># - $activemq_sunjmx_start : options for jmx settings</code>

<code># - $activemq_ssl_opts     : options for ssl encryption</code>

<code>invoke_start(){</code>

<code>      </code><code>pid=`</code><code>cat</code> <code>$activemq_pidfile`</code>

<code>      </code><code>echo</code> <code>"info: process with pid '$pid' is already running"</code>

<code>      </code><code>exit</code> <code>0</code>

<code>    </code><code>activemq_opts=</code><code>"$activemq_opts $activemq_sunjmx_start $activemq_ssl_opts -djava.awt.headless=true -djava.io.tmpdir=\"${activemq_tmp}\""</code>

<code>    </code><code>echo</code> <code>"info: starting - inspect logfiles specified in logging.properties and log4j.properties to get details"</code>

<code>    </code><code>invokejar $activemq_pidfile</code>

<code>    </code><code>exit</code> <code>"$?"</code>

<code># start activemq in foreground (for debugging)</code>

<code>invoke_console(){</code>

<code>      </code><code>echo</code> <code>"error: activemq is already running"</code>

<code>    </code><code>commandline_args=</code><code>"start `echo $commandline_args|sed 's,^console,,'`"</code>

<code>    </code><code>echo</code> <code>"info: starting in foreground, this is just for debugging purposes (stop process by pressing ctrl+c)"</code>

<code>    </code><code>invokejar</code>

<code># stop activemq</code>

<code># @ret  : 0 =&gt; stop was successful</code>

<code># - $activemq_pidfile         : the name of the pid file</code>

<code># - $activemq_kill_maxseconds : the number of seconds to wait for termination of broker after sending</code>

<code>#                              shutdown signal by jmx interface</code>

<code>invoke_stop(){</code>

<code>    </code><code>ret=</code><code>"1"</code>

<code>       </code><code>activemq_opts=</code><code>"$activemq_opts $activemq_ssl_opts"</code>

<code>       </code><code>commandline_args=</code><code>"$commandline_args $activemq_sunjmx_control"</code>

<code>       </code><code>invokejar </code><code>"stop"</code>

<code>       </code><code>ret=</code><code>"$?"</code>

<code>       </code><code>echo</code> <code>"info: waiting at least $activemq_kill_maxseconds seconds for regular process termination of pid '$pid' : "</code>

<code>       </code><code>found=</code><code>"0"</code>

<code>       </code><code>i=1</code>

<code>       </code><code>while</code> <code>[ $i != $activemq_kill_maxseconds ]; </code><code>do</code>

<code>         </code><code>if</code> <code>[ ! checkstoprunning ];</code><code>then</code>

<code>            </code><code>if</code> <code>[ ! checkrunning ]; </code><code>then</code>

<code>               </code><code>echo</code> <code>" finished"</code>

<code>               </code><code>found=</code><code>"1"</code>

<code>            </code><code>fi</code>

<code>            </code><code>break</code>

<code>         </code><code>fi</code>

<code>         </code><code>if</code> <code>(checkrunning);</code><code>then</code>

<code>            </code><code>sleep</code> <code>1</code>

<code>            </code><code>printf</code>  <code>"."</code>

<code>         </code><code>else</code>

<code>            </code><code>echo</code> <code>" finished"</code>

<code>            </code><code>found=</code><code>"1"</code>

<code>         </code><code>i=`</code><code>expr</code> <code>$i + 1`</code>

<code>       </code><code>done</code>

<code>       </code><code>if</code> <code>[ </code><code>"$found"</code> <code>-</code><code>ne</code> <code>"1"</code> <code>];</code><code>then</code>

<code>         </code><code>echo</code>

<code>         </code><code>echo</code> <code>"info: regular shutdown not successful,  sending sigkill to process with pid '$pid'"</code>

<code>         </code><code>kill</code> <code>-kill $pid</code>

<code>         </code><code>ret=</code><code>"1"</code>

<code>    </code><code>elif</code> <code>[ -f </code><code>"$activemq_pidfile"</code> <code>];</code><code>then</code>

<code>       </code><code>echo</code> <code>"error: no or outdated process id in '$activemq_pidfile'"</code>

<code>       </code><code>echo</code>

<code>       </code><code>echo</code> <code>"info: removing $activemq_pidfile"</code>

<code>       </code><code>echo</code> <code>"activemq not running"</code>

<code>       </code><code>exit</code> <code>0</code>

<code>    </code><code>rm</code> <code>-f $activemq_pidfile &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>    </code><code>rm</code> <code>-f $activemq_data</code><code>/stop</code><code>.pid &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>    </code><code>exit</code> <code>$ret</code>

<code># invoke a task on a running activemq instance</code>

<code># @ret  : 0 =&gt; successful</code>

<code># - $activemq_queuemanagerurl : the url of the queuemanager</code>

<code># - $activemq_opts            : additional options</code>

<code># - $activemq_sunjmx_start    : options for jmx settings</code>

<code># - $activemq_ssl_opts        : options for ssl encryption</code>

<code>invoke_task(){</code>

<code>    </code><code># call task in java binary</code>

<code>      </code><code>if</code> <code>[ </code><code>"$1"</code> <code>= </code><code>"browse"</code> <code>] &amp;&amp; [ -n </code><code>"$activemq_queuemanagerurl"</code> <code>];</code><code>then</code>

<code>         </code><code>activemq_opts=</code><code>"$activemq_opts $activemq_ssl_opts"</code>

<code>         </code><code>commandline_args=</code><code>"$1 $activemq_queuemanagerurl `echo $commandline_args|sed 's,^browse,,'`"</code>

<code>      </code><code>elif</code> <code>[ </code><code>"$1"</code> <code>= </code><code>"query"</code> <code>]  &amp;&amp; [ -n </code><code>"$activemq_queuemanagerurl"</code> <code>];</code><code>then</code>

<code>         </code><code>commandline_args=</code><code>"$1 $activemq_sunjmx_control `echo $commandline_args|sed 's,^query,,'`"</code>

<code>      </code><code>else</code>

<code>         </code><code>commandline_args=</code><code>"$commandline_args $activemq_sunjmx_control"</code>

<code>      </code><code>invokejar</code>

<code>      </code><code>exit</code> <code>$?</code>

<code>show_help() {</code>

<code>  </code><code>invokejar</code>

<code>  </code><code>ret=</code><code>"$?"</code>

<code>  </code><code>cat</code> <code>&lt;&lt; eof</code>

<code>tasks provided by the sysv init script:</code>

<code>    </code><code>restart         - stop running instance (</code><code>if</code> <code>there is one), start new instance</code>

<code>    </code><code>console         - start broker </code><code>in</code> <code>foreground, useful </code><code>for</code> <code>debugging purposes</code>

<code>    </code><code>status          - check </code><code>if</code> <code>activemq process is running</code>

<code>    </code><code>setup           - create the specified configuration </code><code>file</code> <code>for</code> <code>this init script</code>

<code>                      </code><code>(see next usage section)</code>

<code>configuration of this script:</code>

<code>    </code><code>the configuration of this script can be placed on </code><code>/etc/default/activemq</code> <code>or $home/.activemqrc.</code>

<code>    </code><code>to use additional configurations </code><code>for</code> <code>running multiple instances on the same operating system</code>

<code>    </code><code>rename or </code><code>symlink</code> <code>script to a name matching to activemq-instance-&lt;instancename&gt;.</code>

<code>    </code><code>this changes the configuration location to </code><code>/etc/default/activemq-instance-</code><code>&lt;instancename&gt; and</code>

<code>    </code><code>\$home/.activemqrc-instance-&lt;instancename&gt;. configuration files </code><code>in</code> <code>/etc</code> <code>have higher precedence.</code>

<code>eof</code>

<code>  </code><code>exit</code> <code>$ret</code>

<code># main</code>

<code># show help</code>

<code>if</code> <code>[ -z </code><code>"$1"</code> <code>];</code><code>then</code>

<code> </code><code>show_help</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code>  </code><code>status)</code>

<code>      </code><code>invoke_status</code>

<code>    </code><code>;;</code>

<code>  </code><code>restart)</code>

<code>      </code><code>$0 stop</code>

<code>    </code><code>$0 status</code>

<code>    </code><code>$0 start</code>

<code>  </code><code>start)</code>

<code>    </code><code>invoke_start</code>

<code>  </code><code>console)</code>

<code>    </code><code>invoke_console</code>

<code>  </code><code>stop)</code>

<code>    </code><code>invoke_stop</code>

<code>  </code><code>*)</code>

<code>    </code><code>invoke_task</code>

一些參考: