Все это очень хрупкая и ошибочная попытка отследить, работает ли данный демон, чтобы узнать, можно ли / как отключить его позже.Использование pids не помогает, потому что pid не имеет никакого значения для любого процесса, кроме прямого родителя процесса ;любое другое использование имеет неразрешимые и опасные условия гонки (т.е. вы можете в конечном итоге убить другой не связанный процесс).К сожалению, этот вид плохо спроектированного (или скорее не спроектированного) хакерства является стандартной практикой в большинстве систем Unix ...
Существует несколько подходов для правильного решения проблемы.Одним из них является подход systemd
, но среди некоторых кругов systemd
не любят, когда он "раздут" и затрудняет использование удаленного /usr
, смонтированного после начальной загрузки.В любом случае решения будут включать:
- Использование мастер-процесса, который порождает всех демонов в качестве прямых потомков (т.е. запрещает «демонизацию» внутри отдельных демонов) и который, таким образом, может использовать их pids для просмотрачтобы они выходили, следите за их состоянием и убивайте их по своему усмотрению.
- Организация для каждого демона наследования бесполезного в противном случае дескриптора файла, который он будет держать открытым и атомарно закрытым только как часть завершения процесса.Каналы (анонимные или именованные fifos), сокеты или даже обычные файлы - все это возможности, но наиболее подходящими являются типы файлов, которые дают EOF, как только закрывается «другой конец», поскольку можно заблокировать ожидание этого состояния.В обычных файлах можно использовать счетчик ссылок (от
stat
), но без повторного опроса ждать его невозможно.
В любом случае подход lockfile / pidfile уродлив, ошибка-просто, и вряд ли лучше, чем ленивые подходы, такие как просто killall foobard
(что, конечно, также неправильно).