2012-04-24

RHEL6: Disable screen saver on console

コンソールのスクリーンセーバーを切りたい。つまり画面がブラックアウトしないようにしたい。RHEL5 では、/etc/rc.d/rc.local に次の 1 行を入れていた。

setterm -blank 0 -powerdown 0

しかし RHEL6 では動かない。恐らく Upstart になったことで、rc.local を実行する端末が tty1 ではなくなったのだろう。方法は幾つかあるだろうが、次を参考に、

SystemV 形式の init script を登録することにする。端末を明示的に指定しているので、どの端末から実行しようと確実にコンソールに作用する。

/etc/rc.d/init.d/mytty:

#!/bin/bash
# mytty  This is the init script for tty configuration
#
# chkconfig: 2345 99 01
# description: Configures tty

# Source function library.
. /etc/rc.d/init.d/functions

# Find the name of the script
NAME=$(basename $0)
if [ ${NAME:0:1} = "S" -o ${NAME:0:1} = "K" ] ; then
    NAME=${NAME:3}
fi

start() {
    local errors=0
    echo -n "Starting $NAME: "
    local term
    for term in /dev/tty[1-6] ; do
	[ -e "$term" ] || continue
	setterm -blank 0 -powerdown 0 >$term <$term || let errors+=1
    done
    if [ $errors -eq 0 ] ; then
	success
    else
	failure
    fi
    echo
    return $errors
}

# See how we were called.
case "$1" in
    start) $1 ;;
    *) ! echo "Usage: $0 {start}" ;;
esac

この理屈でいけば、rc.local に次を書くだけでも良いが、

setterm -blank 0 -powerdown 0 >/dev/tty1 </dev/tty1

ファイルを「編集」するよりもファイルを「追加」する方が、私の好み。その方が作業の自動化という面で都合が良い。

「編集」の場合、インストール(追加)は良くてもアンインストール(削除)が難しい。人が手で同種の設定を追加していた場合、それは削除せずにそのまま残すのが望ましい(でないと「勝手に消された」と言われる)が、それを確実に判断する方法がない。「追加」の場合は、追加したファイルを削除するだけで済む。

同様の処理を Upstart (/etc/init)に登録する方法もあるが、わざわざ SystemV (/etc/rc.d/init.d)に登録するのは、RHEL5 でも動くようにするため。


2017-05-09 追記

残念ながら、以上は RHEL7 では動かない。

May 09 16:17:23 rhel7 systemd[1]: Starting SYSV: Configures tty...
May 09 16:17:23 rhel7 mytty[1357]: Starting mytty: setterm: $TERM is not defined.
May 09 16:17:23 rhel7 mytty[1357]: setterm: $TERM is not defined.
May 09 16:17:23 rhel7 mytty[1357]: setterm: $TERM is not defined.
May 09 16:17:23 rhel7 mytty[1357]: setterm: $TERM is not defined.
May 09 16:17:23 rhel7 mytty[1357]: setterm: $TERM is not defined.
May 09 16:17:23 rhel7 mytty[1357]: setterm: $TERM is not defined.
May 09 16:17:23 rhel7 mytty[1357]: [失敗]
May 09 16:17:23 rhel7 systemd[1]: mytty.service: control process exited, code=exited status=6
May 09 16:17:23 rhel7 systemd[1]: Failed to start SYSV: Configures tty.
May 09 16:17:23 rhel7 systemd[1]: Unit mytty.service entered failed state.
May 09 16:17:23 rhel7 systemd[1]: mytty.service failed.

TERM が未定義、と言われて setterm が失敗する。これはオプション -term linux で解決できるが、

May 09 16:25:19 rhel7 systemd[1]: Stopping SYSV: Configures tty...
May 09 16:25:19 rhel7 mytty[3513]: Usage: /etc/rc.d/init.d/mytty {start}
May 09 16:25:19 rhel7 systemd[1]: mytty.service: control process exited, code=exited status=1
May 09 16:25:19 rhel7 systemd[1]: Stopped SYSV: Configures tty.
May 09 16:25:19 rhel7 systemd[1]: Unit mytty.service entered failed state.
May 09 16:25:19 rhel7 systemd[1]: mytty.service failed.

今度はシャットダウン時に未実装の stop を呼ばれて失敗する。なので stop も実装する必要がある。

以下、RHEL7 対応版。

/etc/rc.d/init.d/mytty:

#!/bin/bash
# mytty  This is the init script for tty configuration
#
# chkconfig: 2345 99 01
# description: Configures tty

# Source function library.
. /etc/rc.d/init.d/functions

# Find the name of the script
NAME=$(basename $0)
if [ ${NAME:0:1} = "S" -o ${NAME:0:1} = "K" ] ; then
    NAME=${NAME:3}
fi

start() {
    local errors=0
    echo -n "Starting $NAME: "
    local term
    for term in /dev/tty[1-6] ; do
	[ -e "$term" ] || continue
	setterm -term linux -blank 0 -powerdown 0 >$term <$term \
	    || let errors+=1
    done
    if [ $errors -eq 0 ] ; then
	success
    else
	failure
    fi
    echo
    return $errors
}

# See how we were called.
case "$1" in
    start) $1 ;;
    stop) : ;;
    *) ! echo "Usage: $0 {start|stop}" ;;
esac

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。