Movatterモバイル変換


[0]ホーム

URL:


BLOGTIMES

cles::blog

平常心是道
« :: »
2014/06/04

/etc/init.d/hoge start と service hoge start は何が違う?

  systemmanagemant  cli 
このエントリーをはてなブックマークに追加

普段、Linux でデーモンを制御するには/etc/init.d/hoge というスクリプトを叩いている*1のですが、あるマニュアルを読んだらservice hoge を使いましょう的なことが書いてありました。
試してみると確かに /etc/init.d/hoge start の代わりに service hoge start としても同じようにデーモンが起動できるようです。

ただ、困ったことに僕にはこの2つの違いがよく理解できません。
この業界では似たようなものが2つ存在する場合に、その違いが理解できない状態というのは未来の失敗につながっているというのが常なので、この際なのでしっかり調べておくことにしました。

そもそも、この service が何者なのかということですが、/sbin に配置されているコマンドのようです。

# which service/sbin/service

以下、調査メモ。

man を見てみる

普通のコマンドならば man でヘルプが見られるはずということで内容を確認してみました。
結局は /etc/init.d/hoge を起動するコマンドのようなので、一見 init.d スクリプトの直接起動と大差ないように見えます。
が、できる限り予測可能な環境でスクリプトを起動するために、ほとんどの環境変数を削除し、カレントディレクトリを / に変更してから実行するというのが大きな違いということみたいですね。

# man serviceservice(8) service(8)NAME service - run a System V init scriptSYNOPSIS service SCRIPT COMMAND [OPTIONS] service --status-all service --help | -h | --versionDESCRIPTION service runs a System V init script in as predictable environment as possible, removing most environment variables and with current working directory set to /. The SCRIPT parameter specifies a System V init script, located in /etc/init.d/SCRIPT. The supported values of COM- MAND depend on the invoked script, service passes COMMAND and OPTIONS it to the init script unmodified. All scripts should support at least the start and stop commands. As a special case, if COMMAND is --full-restart, the script is run twice, first with the stop command, then with the start command. service --status-all runs all init scripts, in alphabetical order, with the status command.FILES /etc/init.d The directory containing System V init scripts.ENVIRONMENT LANG, TERM The only environment variables passed to the init scripts.SEE ALSO chkconfig(8), ntsysv(8) Jan 2006 service(8)

ちなみに中身はバイナリではなく普通のシェルスクリプトでした。

# cat /sbin/service#!/bin/sh. /etc/init.d/functionsVERSION="`basename $0` ver. 0.91"USAGE="Usage: `basename $0` < option > | --status-all | \[ service_name [ command | --full-restart ] ]"SERVICE=SERVICEDIR="/etc/init.d"OPTIONS=if [ $# -eq 0 ]; then echo "${USAGE}" >&2 exit 1ficd /while [ $# -gt 0 ]; do case "${1}" in --help | -h | --h* ) echo "${USAGE}" >&2 exit 0 ;; --version | -V ) echo "${VERSION}" >&2 exit 0 ;; *) if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then cd ${SERVICEDIR} for SERVICE in * ; do case "${SERVICE}" in functions | halt | killall | single| linuxconf| kudzu) ;; *) if ! is_ignored_file "${SERVICE}" \ && [ -x "${SERVICEDIR}/${SERVICE}" ]; then env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" status fi ;; esac done exit 0 elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then SERVICE="${1}" if [ -x "${SERVICEDIR}/${SERVICE}" ]; then env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" stop env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" start exit $? fi elif [ -z "${SERVICE}" ]; then SERVICE="${1}" else OPTIONS="${OPTIONS} ${1}" fi shift ;; esacdoneif [ -x "${SERVICEDIR}/${SERVICE}" ]; then env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS}else echo $"${SERVICE}: unrecognized service" >&2 exit 1fi

CentOS だと挙動が違う?

CentOS 6.x に入っている service は実装としては man の説明とは動作が異なるようです。
下記で違いが解説されていました。

デーモンの起動・終了にはserviceコマンドを利用しよう - インフラエンジニアway - Powered by HEARTBEATS

しかし、manの内容と違う部分があります。PATH, LANGは引き継ぐはずなのですが、引き継がれていません。どうしたものでしょうか。原因を調べるため、テストした環境の"/sbin/service"コマンドの中を確認してみました。その結果、次の2点がわかりました。
  • PATH変数が上書きされている。2行目(最初の段階) で"/etc/init.d/functions"が呼び出され、この中で行われている。
  • 38, 47, 48, 62行目(※1)でPATH, TERM変数のみ引き継ぐようにしている。"env -i"を用いて環境変数をクリアした後、PATH, TERM変数のみ再定義し、スクリプトを実行している。
  • *1: /etc/init.d/hoge の方が補完が効くので便利なんですよね。

byhsur at 21:47[5年前][4年前][3年前][2年前][1年前][1年後][2年後][3年後][4年後][5年後] |
こんな記事もあります 「init.d デーモン service
GitHub が全ての公開リポジトリへのシークレットスキャンを有効に
docker-compose を使って Neo4J を立てる
フレッツ光提供地域外でもフレッツ ADSL 終了へ
うるう秒は 2035 年までに廃止される
time.aws.com が公開 NTP サーバーとして使えるように
Windows 用の SIP クライアント Linphone
Yamaha ルータ+ぷらら光メイトでぷららv6エクスプレス(DS-Lite編)
Yamaha ルータ+ぷらら光でぷららv6エクスプレス(MAP-E編)
NII がオープンサイエンスのためのデータ管理基盤ハンドブックを公開
ESXi7 の ssh で ed25519 を有効化する
トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6767
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL:Yahoo! JAPAN IDでログイン

« :: »
Copyright © 2004-2023 by CLES All Rights Reserved.
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 .アーロンチェアのポスチャーフィットを修理(99774)
2 .福岡銀がデマの投稿者への刑事告訴を検討中(99163)
3 .年次の人間ドックへ(99156)
4 .三菱鉛筆がラミーを買収(98761)
5 .2023 年分の確定申告完了!(1つめ)(98727)
最新のエントリ
cles::blogについて
誰が書いてる?
最近行った場所
サイトポリシー
タグ一覧
検索ワードランキング

Referrers

    Powered by CLES
    Nucleus CMS v3.31SP3/w memcached
    21376887(W:7512 Y:1720 T:0986)
    cles::blogのはてなブックマーク数
    benchmark


    [8]ページ先頭

    ©2009-2025 Movatter.jp