Я написал небольшой демон, который запускается во время загрузки и делает все идеально, например, записывает в файл журнала. Но я хочу знать, как мы можем проверить, является ли этот процесс демоном или нет? Мой профессор рассказал мне о команде
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, с которой вы в конечном итоге можете столкнуться с конфликтом.