Как проверить, является ли процесс демоном или нет?

Как проверить, является ли процесс демоном или нет?

Я написал небольшой демон, который запускается во время загрузки и делает все идеально, например, записывает в файл журнала. Но я хочу знать, как мы можем проверить, является ли этот процесс демоном или нет? Мой профессор рассказал мне о команде ps -xj | grep daemon(имя моего файла daemon), но я не уверен в этом, так как она показывает нежелательную информацию. Есть ли какая-нибудь команда оболочки для этого?

правка: я использую Ubuntu 14.04 LTS

решение1

Все, что имеет PPID 1, по большей части, скорее всего, является демоном. Но могут возникнуть ситуации, когда процессы могут стать потомками 1, которые технически не являются демонами. Поэтому методы, которые я обсуждаю ниже, призваны продемонстрировать, как вы будете определять, принадлежит ли PID 1, а не обязательно, что это настоящий демон.

Например

$ ps -xj
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 8420  1211  1211  8420 pts/4     1211 S+    1000   0:01 ssh dufresne
    1  2276  2275  2275 ?           -1 Sl    1000   0:48 /usr/bin/gnome-keyring-daemon --daemonize --login
 2196  2278  2278  2278 ?           -1 Ssl   1000   0:39 gnome-session
    1  2288  2278  2278 ?           -1 S     1000   0:00 dbus-launch --sh-syntax --exit-with-session
    1  2289  2289  2289 ?           -1 Ssl   1000   6:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
    1  2358  2289  2289 ?           -1 Sl    1000   0:01 /usr/libexec/gvfsd

Отрывок из Википедии также может пролить свет на некоторые вещи, но он также оставляет неясным, как на самом деле определить, является ли процесс демоном или нет.

выдержка из Википедии

В среде Unix родительским процессом демона часто, но не всегда, является процесс init. Демон обычно создается либо процессом, разветвляющим дочерний процесс, а затем немедленно завершающим работу, тем самым заставляя init принять дочерний процесс, либо процессом init, напрямую запускающим демон. Кроме того, демон, запущенный разветвлением и завершением работы, обычно должен выполнять другие операции, такие как отсоединение процесса от любого управляющего терминала (tty). Такие процедуры часто реализуются в различных удобных процедурах, таких как daemon(3) в Unix.

ПРИМЕЧАНИЕ:в системах, использующих SystemD (дистрибутивы Red Hat, такие как Fedora), обычно нет никакого initпроцесса, а вместо этого происходит следующее:

$ ps -j -1
  PID  PGID   SID TTY      STAT   TIME COMMAND
    1     1     1 ?        Ss     0:42 /usr/lib/systemd/systemd --switched-root --system --deserialize 20

Это процесс с PID 1.

В системах Debian/Ubuntu процесс по-прежнему будет называться init:

$ ps -j -1
  PID  PGID   SID TTY      STAT   TIME COMMAND
    1     1     1 ?        Ss     0:02 /sbin/init

Так что же такое демон?

Вот почему может быть сложно определить, является ли что-то демоном или нет, если его PPID равен 1:

Процесс может стать дочерним процессом процесса init, (ПРИМЕЧАНИЕ:этот initпроцесс имеет PID 1), когда их родитель завершается или отрекается от них, эти процессы не обязательно являются демонами, но все равно будут отображаться как имеющие свой PPID, равный 1.

Таким образом, чтобы определить, является ли что-то демоном или нет, скорее всего, потребуется провести ряд тестов, а не просто посмотреть, равен ли его PPID 1.

Так, где это оставляет нас?

Чтобы определить, является ли что-то демоном, вам, скорее всего, придется прибегнуть к различным тестам, таким как:

  • ППИД 1?
  • Подключен ли TTY?
  • Это услуга? sudo service ...?
  • Управляется ли он Systemd, Upstart или SysV?
  • Прослушивает ли он порт?
  • Пишет ли он в файл журнала?

Поэтому нам приходится прибегать к «утиной типизации»: если что-то крякает и плавает, то это, скорее всего, утка, но даже вышеперечисленные характеристики могут вас обмануть.

Рекомендации

решение2

Нет способа отличить обычный процесс от процесса-демона. Демон может быть запущен откуда угодно, не только init. Не обязательно дважды форкать и отсоединяться от терминала, чтобы считаться демоном.

В системах GNOME gnome-settings-daemon сохраняет своего родителя, регистрируется на терминале родителя и не имеет PID1 в качестве родительского PID, однако он по-прежнему считается демоном.

Демон — это просто непрерывно работающий процесс. Поэтому их невозможно идентифицировать одной командой.

Теперь, если вы хотите узнать, запущен ли ваш конкретный демон, взгляните на команду pgrep.

Также измените имя вашего демона, так как уже существует команда с именем daemon, с которой вы в конечном итоге можете столкнуться с конфликтом.

Связанный контент