dil: (Default)
dil ([personal profile] dil) wrote2011-01-22 03:16 pm

Грабельки, хорошо присыпанные листвой

Конечно, я на них наступил. На домашней машинке, работающей по совместительству роутером в провайдерские интернеты, в /etc/rc.local было несколько команд. В один прекрасный день, после какого-то апгрейда, они перестали работать. Причём запускаешь вручную после загрузки системы — всё работает.

При внимательном разглядывании после включения всей отладочной информации обнаружилось, что сам по себе скрипт при загрузке системы запускается, но выполняется из него ровно одна команда. Первая: rmmod usbhid. Неудачно, потому что на этот момент модуль usbhid ещё не загружен. А остальные выполняться перестали совсем.

Вопрос для сисадминов нумер раз: угадайте, почему. Вопрос нумер два: какого хрена?

Полные тексты /etc/init.d/rc.local и /etc/rc.local под катом.

/etc/init.d/rc.local:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rc.local
# Required-Start:    $remote_fs $syslog $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start() {
	if [ -x /etc/rc.local ]; then
	        [ "$VERBOSE" != no ] && log_begin_msg "Running local boot scripts (/etc/rc.local)"
		/etc/rc.local
		ES=$?
		[ "$VERBOSE" != no ] && log_end_msg $ES
		return $ES
	fi
}

case "$1" in
    start)
	do_start
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

/etc/rc.local:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/sbin/rmmod usbhid
/sbin/modprobe hid-aureal
/sbin/modprobe usbhid
/usr/local/sbin/masq.sh
exit 0

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

[identity profile] rzab.livejournal.com 2011-01-22 02:22 pm (UTC)(link)
sh -e. выпадет при первом ненулевым exitcode

[identity profile] dil.livejournal.com 2011-01-22 02:28 pm (UTC)(link)
Ага. И какая сволочь это туда написала?

[identity profile] rzab.livejournal.com 2011-01-22 02:43 pm (UTC)(link)
Ну это способ вернуться в singleuser если что-то пошло не так. Чтобы проигнорировать результат именно rmmod, можно сказать rmmod usbhid || true

[identity profile] dil.livejournal.com 2011-01-22 03:10 pm (UTC)(link)
Не понял. При чем тут singleuser? Оно ж запускается только на ранлевелах 2 3 4 5.

[identity profile] rzab.livejournal.com 2011-01-22 03:31 pm (UTC)(link)
Пожалуй, вам лучше знать, я по тонкостям линукса легко окажусь неправым

Может быть, расчет был на то, что сдедующие команды в rc.local расчитывают на успех предыдущих

[identity profile] dil.livejournal.com 2011-01-22 04:40 pm (UTC)(link)
Линукс тут не при делах, логика вызова rc.local одинакова для всех юниксов. И такое нововведение, вдобавок незадокументированное в самом скрипте, оказалось сильно неожиданным. Тем более, что в других проверенных дистрибутивах (RH, CentOs) такого нет. Это было в убунте, но его придумали не там, в дебиане оно тоже есть.

[identity profile] bsv9.livejournal.com 2011-01-22 02:44 pm (UTC)(link)
Вообщем то виновника видно в первой строке /etc/rc.local
Обычно его вставляют для параноидальности, что бы не порушить последовательность команд. Но в данном случае я думаю это глупость, и надо файлить в багзилу.

[identity profile] dil.livejournal.com 2011-01-22 04:40 pm (UTC)(link)
Я тоже так думаю. Для rc.local это неожиданное поведение.

[identity profile] jerom.livejournal.com 2011-01-22 03:03 pm (UTC)(link)
Да там set -e где-то.

[identity profile] dil.livejournal.com 2011-01-22 04:41 pm (UTC)(link)
Ага, прямо в первой строчке

[identity profile] dmarck.livejournal.com 2011-01-22 03:13 pm (UTC)(link)
Что, неужели rmmod при неудаче киляет родителя?!

[identity profile] dil.livejournal.com 2011-01-22 03:28 pm (UTC)(link)
Не угадал :)

А, проглядел

[identity profile] dmarck.livejournal.com 2011-01-22 03:30 pm (UTC)(link)
   -e errexit
             Exit immediately if any untested command fails in non-interactive
             mode.  The exit status of a command is considered to be explic-
             itly tested if the command is part of the list used to control an
             if, elif, while, or until; if the command is the left hand oper-
             and of an ``&&'' or ``||'' operator; or if the command is a pipe-
             line preceded by the ! operator.  If a shell function is executed
             and its exit status is explicitly tested, all commands of the
             function are considered to be tested as well.


Мда.

Re: А, проглядел

[identity profile] dil.livejournal.com 2011-01-22 04:53 pm (UTC)(link)
вооот..

[identity profile] b-a-t.livejournal.com 2011-01-22 03:24 pm (UTC)(link)
Фря? sh -e?

[identity profile] dil.livejournal.com 2011-01-22 04:41 pm (UTC)(link)
линукс, но это ничего не меняет.

[identity profile] bruzh.livejournal.com 2011-01-22 03:35 pm (UTC)(link)
>/bin/sh -e

из-за этого ?
для вash это вроде означает умереть сразу после первого non-zero exit code.


[identity profile] dil.livejournal.com 2011-01-22 04:41 pm (UTC)(link)
Да. Переходим ко второму вопросу: нафига это в rc.local??

[identity profile] kranov.livejournal.com 2011-01-22 03:43 pm (UTC)(link)
-e

[identity profile] kranov.livejournal.com 2011-01-22 04:10 pm (UTC)(link)
погуглил, ты не один пострадавший, и ответа "зачем" нет, похоже индус какой-то улучшил.

[identity profile] dil.livejournal.com 2011-01-22 04:51 pm (UTC)(link)
Я этот улучшизм обнаружил только в дебиане и убунте.

[identity profile] starcat13.livejournal.com 2011-01-22 04:32 pm (UTC)(link)
rmmod как-то хитро переопределяется в /lib/init/vars.sh или
/lib/lsb/init-functions ?

[identity profile] dil.livejournal.com 2011-01-22 04:51 pm (UTC)(link)
Нет, всё проще. -e

[identity profile] starcat13.livejournal.com 2011-01-22 05:06 pm (UTC)(link)
слона то и не приметил :(
да, интересно таки - зачем?

[identity profile] nil59.livejournal.com 2011-01-22 05:39 pm (UTC)(link)
я как раз, глядя на результаты исследований, думал, что -е - это грабли. а тут и ссылка подоспела :)