🤔

【未解決】serviceコマンドの結果を英語で出力する

2023/03/17に公開

はじめに

目的

init.dで管理されているサービスにおいて、起動しているサービス一覧の出力を英語にしたい。

service --status-all

環境情報

  • OS
    CentOS 6
    ※古いですが、目を瞑ってください
  • ロケール
    ja_jp
  • 備考
    SSHにて実行しています。

実施したこと

基本は、通常実行するコマンドの頭に、「LANG=C」を付ければ一時的に結果の出力を変えることが出来ます。

  • 通常通り実行した場合
$ date
2023年  3月 17日 金曜日 19:07:55 JST
  • 頭に"LANG=C"を付けて実行した場合
$ LANG=C date
Fri Mar 17 11:08:00 JST 2023

上記同様、serviceコマンドを使って出力しようとすると、以下のように出力が変わらないです。

  • 通常通り実行した場合
# service ntpd status
ntpd (pid XXXX) を実行中...
  • 頭に"LANG=C"を付けて実行した場合
# LANG=C service ntpd status
ntpd (pid XXXX) を実行中...

ということで、掘り下げて調べてみます。

/sbin/service
#!/bin/sh

# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
export PATH

VERSION="`basename $0` ver. 0.91"
USAGE="Usage: `basename $0` < option > | --status-all | \
[ service_name [ command | --full-restart ] ]"
SERVICE=
SERVICEDIR="/etc/init.d"
OPTIONS=

(中略)

       if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
	 (略)
                if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
                  env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" status
                fi
                ;;
            esac
          done
(以下略)

今回、serviceコマンドでstatusを用いているので、「env -i LANG=...」の部分にあたります。
「env -i」は環境変数が設定されていない状態でコマンドを実行するオプションなので、
このオプションが機能しているのでロケールが変わらないんですね。。。

おわりに

serviceコマンドのshも書き換えたくないので、模索してましたが、
サービスが起動していると「(pid XXXX)」と出るため、
取り急ぎは以下のような形で対応しました。
もはやこれが正解なんでしょうか・・・?

service --status-all |grep "pid" |awk '{print $1}'

systemdだと簡単にできるから楽なんですけどね・・・

Discussion