Назначение файла блокировки в скриптах демона init.d (linux) - PullRequest
0 голосов
/ 01 октября 2011

При просмотре различных сценариев демона в /etc/init.d/ я не могу понять назначение переменной 'lockfile'. Кажется, переменная lockfile не проверяется перед запуском демона.

Например, некоторый код из /etc/init.d/ntpd:

prog=ntpd
lockfile=/var/lock/subsys/$prog

start() {
        [ "$EUID" != "0" ] && exit 4
        [ "$NETWORKING" = "no" ] && exit 1
        [ -x /usr/sbin/ntpd ] || exit 5
        [ -f /etc/sysconfig/ntpd ] || exit 6
        . /etc/sysconfig/ntpd

        # Start daemons.
        echo -n $"Starting $prog: "
        daemon $prog $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch $lockfile
        return $RETVAL
}

Что делает переменная 'lockfile'?

Кроме того, при написании моего собственного демона на C ++ (например, следуя примеру внизу http://www.itp.uzh.ch/~dpotter/howto/daemonize), я помещаю скомпилированный двоичный файл непосредственно в /etc/init.d/ или я помещаю туда скрипт который вызывает двоичный файл (т.е. заменяет 'daemon $ prog' в приведенном выше коде вызовом моего двоичного файла?)

Ответы [ 3 ]

2 голосов
/ 01 октября 2011

Все это очень хрупкая и ошибочная попытка отследить, работает ли данный демон, чтобы узнать, можно ли / как отключить его позже.Использование pids не помогает, потому что pid не имеет никакого значения для любого процесса, кроме прямого родителя процесса ;любое другое использование имеет неразрешимые и опасные условия гонки (т.е. вы можете в конечном итоге убить другой не связанный процесс).К сожалению, этот вид плохо спроектированного (или скорее не спроектированного) хакерства является стандартной практикой в ​​большинстве систем Unix ...

Существует несколько подходов для правильного решения проблемы.Одним из них является подход systemd, но среди некоторых кругов systemd не любят, когда он "раздут" и затрудняет использование удаленного /usr, смонтированного после начальной загрузки.В любом случае решения будут включать:

  1. Использование мастер-процесса, который порождает всех демонов в качестве прямых потомков (т.е. запрещает «демонизацию» внутри отдельных демонов) и который, таким образом, может использовать их pids для просмотрачтобы они выходили, следите за их состоянием и убивайте их по своему усмотрению.
  2. Организация для каждого демона наследования бесполезного в противном случае дескриптора файла, который он будет держать открытым и атомарно закрытым только как часть завершения процесса.Каналы (анонимные или именованные fifos), сокеты или даже обычные файлы - все это возможности, но наиболее подходящими являются типы файлов, которые дают EOF, как только закрывается «другой конец», поскольку можно заблокировать ожидание этого состояния.В обычных файлах можно использовать счетчик ссылок (от stat), но без повторного опроса ждать его невозможно.

В любом случае подход lockfile / pidfile уродлив, ошибка-просто, и вряд ли лучше, чем ленивые подходы, такие как просто killall foobard (что, конечно, также неправильно).

1 голос
/ 01 октября 2011

Что делает переменная 'lockfile'?

Это может быть ничего или это может быть, например.вводится в $OPTIONS этой строкой

   . /etc/sysconfig/ntpd

Демон принимает параметр -p pidfile, куда может пойти $lockfile.В этом файле демон записывает $PID.

помещать ли я скомпилированный двоичный файл непосредственно в /etc/init.d/ или я помещаю туда скрипт, который вызывает двоичный файл

Последний.В /etc не должно быть двоичных файлов, и это обычно для редактирования /etc/init.d сценариев для изменения конфигурации.Двоичные файлы должны идти в /(s)bin или /usr/(s)bin.

1 голос
/ 01 октября 2011

Сценарии rc отслеживают, запущен он или нет, и не мешают остановить то, что не работает.

...