Linux の不要サービスを停止するruby スクリプト

ネタ元は不要サービス の停止 - chibilog++です。
サーバのセットアップをすると、OS のインストール後にやることとして、「不要なサービスの停止」があります。1つずつ、停止して、自動起動のリストから外すとかやるのは面倒なので、スクリプトでやってしまおうという作戦。


ネタ元はperl で書かれていたのでruby で書いてみました。テストした環境はCent0S5.2 です。

#!/usr/bin/ruby

def active?(service)
  open("/etc/init.d/#{service} status").read.split.each do |status|
    return true status !~ /stopped/
  end

  false
end

def inactive(services)
  extend_each(services) do |s|
    system("/etc/init.d/#{s} stop") if active?(s)
    system("/sbin/chkconfig --level 2345 #{s} off")
  end
end

def status(services)
  extend_each(services) do |s|
    system("/sbin/chkconfig --list #{s}")
  end
end

def extend_each(array_or_not)
  to_a(array_or_not).each do |e|
    yield(e)
  end
end

def to_a(array_or_not)
  Array(array_or_not)
end


if $0 == __FILE__
services = %w(
    apmd
    auditd
    autofs
    avahi-daemon
    bluetooth
    cups
    firstboot
    gpm
    hidd
    ip6tables
    kudzu
    mcstrans
    mdmonitor
    netfs
    nfslock
    pcscd
    portmap 
    restorecond
    rpcgssd
    rpcidmapd
    sendmail
    xfs
    xinetd
    yum-updatesd
)

inactive(services)
status(services)
end
メモ
  • extend_each

これは蛇足です。最近、Array() というイディオムを教えてもらったので、覚えるために書きました。

# is_a? とか使わないで、配列を取り出せる
Array(1)   #=> [1]
Array([1]) #=> [1] 
  • active?

inin.d 下にあるスクリプトによっては、複数のサービスを起動するものもある(xfs 等)ので、全てが停止していない限りはactive であると判断するようにしています。
このメソッドの実装はかなり怪しい。i18n ファイルで言語が日本語に設定されていたらほぼtrue になる。
でも、サービスが停止しているのにこのメソッドがtrue を返した場合、inactive の実行中に「失敗」という文字がでるが特に問題ない。停止しているスクリプトに対して、「/etc/init.d/service stop」を行うとそうなる。

  • perl 版の方が実用的

perlLinuxディストリビューションにおいてプリインストールされていることが多い。ruby は大抵インストールする必要があるので、上記のスクリプトがすぐに使えないという欠点があります。
サービスの停止は最初にやる作業なので、これは致命的(⊃д⊂)


ちょっと蛇足が多すぎたかも。