- How to list all running daemons?
- 3 Answers 3
- Как проверить, запущен ли демон Docker или контейнер
- Проверка с помощью Systemctl
- Проверка деталей процесса
- Обработка зависших файлов процесса
- Проверка отдельных контейнеров
- Заключение
- Как проверить, запущена ли служба демона с помощью задания или скрипта Cron?
- 2 ответа
How to list all running daemons?
From my question Can Process id and session id of a daemon differ?, it was clear that I cannot easily decide the features of a daemon. I have read in different articles and from different forums that service —status-all command can be used to list all the daemons in my system. But I do not think that the command is listing all daemons because NetworkManager , a daemon which is currently running in my Ubuntu 14.04 system, is not listed by the command. Is there some command to list the running daemons or else is there some way to find the daemons from the filesystem itself?
Are you sure it’s not listed? How are you checking? I can see it on my Debian. Note that the name is network-manager , not NetworkManager .
Yes. I am sure. Nothing related to the term network is listed. Also it lists anacron which is mentioned as not a daemon in its init script.
Anacron not being a daemon is more a question of semantics because it is not run constantly. It is still run as a service which is what you normally refer to as daemons. Please edit your question and i) tell us which Ubuntu you are running and ii) what exactly you mean by «daemon». What is your final objective here?
I suppose any service running in the background is a daemon. I mentioned anacron because it was said in /etc/init.d/anacron that it is not a daemon. My objective is to write a C++ program to list all daemons running in my system. For that I need to know which files to parse to get the details.
Well, if you define daemons as services, service —status-all is what you need. Ubuntu seems to treat NetworkManager differently. I get both networking and network-manager in the output of services —status-all on Debian but only networking on Ubuntu. I think you need to define what exactly you mean by «daemon».
3 Answers 3
The notion of daemon is attached to processes, not files. For this reason, there is no sense in «finding daemons on the filesystem». Just to make the notion a little clearer : a program is an executable file (visible in the output of ls ) ; a process is an instance of that program (visible in the output of ps ).
Now, if we use the information that I gave in my answer, we could find running daemons by searching for processes which run without a controlling terminal attached to them. This can be done quite easily with ps :
The tty output field contains «?» when the process has no controlling terminal.
The big problem here comes when your system runs a graphical environment. Since GUI programs (i.e. Chromium) are not attached to a terminal, they also appear in the output. On a standard system, where root does not run graphical programs, you could simply restrict the previous list to root’s processes. This can be achieved using ps ‘ -U switch.
Yet, two problems arise here:
- If root is running graphical programs, they will show up.
- Daemons running without root privileges won’t. Note that daemons which start at boot time are usually running as root.
Basically, we would like to display all programs without a controlling terminal, but not GUI programs. Luckily for us, there is a program to list GUI processes : xlsclients ! This answer from slm tells us how to use it to list all GUI programs, but we’ll have to reverse it, since we want to exclude them. This can be done using the —deselect switch.
First, we’ll build a list of all GUI programs for which we have running processes. From the answer I just linked, this is done using.
$ xlsclients | cut -d' ' -f3 | paste - -s -d ','
Now, ps has a -C switch which allows us to select by command name. We just got our command list, so let’s inject it into the ps command line. Note that I’m using —deselect afterwards to reverse my selection.
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect
Now, we have a list of all non-GUI processes. Let’s not forget our «no TTY attached» rule. For this, I’ll add -o tty,args to the previous line in order to output the tty of each process (and its full command line) :
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?
The final grep captures all lines which begin with «?», that is, all processes without a controlling tty. And there you go! This final line gives you all non-GUI processes running without a controlling terminal. Note that you could still improve it, for instance, by excluding kernel threads (which aren’t processes).
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?
. or by adding a few columns of information for you to read:
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?
Как проверить, запущен ли демон Docker или контейнер
Docker использует архитектуру на основе демона, в которой CLI подключается к долгоживущему процессу, работающему отдельно на вашем компьютере или удаленном хосте. Команды CLI не будут работать, и ваши контейнеры обычно отключаются, если демон останавливается.
Вот как проверить, работает ли демон Docker, чтобы вы могли диагностировать проблемы с контейнерами и командой docker . Когда демон не запущен, вы будете видеть сообщение «невозможно подключиться к демону Docker» каждый раз, когда используете интерфейс командной строки docker .
Проверка с помощью Systemctl
Вы можете проверить статус Docker с помощью systemctl в дистрибутивах, использующих Systemd для управления службами. Это касается большинства популярных операционных систем, включая Debian, Ubuntu, CentOS и Red Hat.
sudo systemctl status docker
Проверьте, что отображается в разделе «Активно». Если вы видите active (running) зеленым цветом, демон Docker работает, и ваши контейнеры должны работать.
Активное состояние inactive указывает на то, что служба остановлена. Попробуйте запустить его, запустив sudo systemctl start docker . Статус должен измениться на active (running) после запуска демона.
Если вы видите статус failed красным цветом, демон не может запуститься из-за ошибки. Вам следует просмотреть журналы запуска службы, показанные позже в выходных данных команды systemctl , поскольку они обычно содержат подсказки, которые позволяют вам понять, что пошло не так.
Если нет доступного очевидного решения, вручную запустите демон в режиме отладки, чтобы получить больше информации о его процедуре запуска.
Перезагрузка хост-компьютера или перезапуск службы Docker с помощью systemctl restart docker также может помочь устранить временные проблемы.
Проверка деталей процесса
Еще один способ проверить работающий демон Docker — проверить его файл идентификатора процесса. Демон записывает свой идентификатор процесса в /var/run/docker.pid при каждом запуске. Когда этот файл существует, Docker должен быть запущен и готов к соединениям CLI.
Вы можете использовать эту технику для создания программных сценариев, которые проверяют, жив ли демон. Чтение файла дает вам идентификатор, который вы можете использовать с такими инструментами, как top , чтобы получить больше информации о процессе Docker:
cat /var/run/docker.pid # process -p 1000
Вы также можете получить идентификатор процесса с помощью команды pidof . Это принимает имя процесса и возвращает первый соответствующий идентификатор:
pidof dockerd # process view information with top top -p `pidof dockerd`
На вашем компьютере есть активный демон Docker, если top соответствует процессу dockerd . Это может быть более надежным, чем поиск docker.pid — в случае сбоя демона docker.pid может остаться позади после завершения процесса.
Обработка зависших файлов процесса
Демон откажется перезапускаться при наличии файла PID. Это может привести к тому, что вы застрянете в цикле перезапуска, если файл фактически потерялся из-за предыдущего запуска. Вы увидите это сообщение при запуске dockerd :
failed to start daemon: pid file found, ensure docker is not running or delete /var/run/docker.pid
Используйте pidof dockerd , чтобы убедиться, что Docker действительно остановлен. Продолжайте, если команда не выдает никаких выходных данных, подтверждая, что нет запущенного процесса.
Запустите sudo rm /var/run/docker.pid , чтобы удалить старый файл идентификатора процесса. Теперь демон должен успешно запуститься при следующем запуске dockerd или service docker start .
Проблемы с файлом PID обычно возникают, когда вы делаете снимок виртуальной машины, а затем создаете новый экземпляр из образа. Файл процесса будет включен в моментальный снимок, в результате чего демон Docker в новой виртуальной машине будет думать, что он уже запущен.
Проверка отдельных контейнеров
Доступ к состоянию отдельных контейнеров осуществляется с помощью команды docker ps . Это создает таблицу, содержащую сведения обо всех запущенных в данный момент контейнерах.
Объедините команду docker ps с grep , чтобы легко проверить, запущен ли конкретный контейнер, по идентификатору или имени:
docker ps | grep my-container-name
Теперь вывод будет отфильтрован, чтобы показать выбранный вами контейнер. Если контейнер не запущен, записей не будет.
Остановленные контейнеры отображаются с помощью docker ps -a . Остановленный контейнер можно запустить с помощью команды docker start :
Затем контейнер переместится в обычный вывод docker ps . Вы можете остановить его снова с помощью docker stop my-container .
Заключение
У вас есть несколько вариантов, которые следует учитывать, когда вы хотите узнать, работает ли Docker. Это диспетчер служб вашей операционной системы, файл docker.pid и обычные инструменты проверки процессов, такие как top и pidof .
Когда дело доходит до отдельных контейнеров, docker ps предоставляет список всего, что в данный момент работает на вашем хосте. Более полную информацию о состоянии любого контейнера можно получить с помощью docker inspect container-name , который предоставляет сведения о конфигурации сети, томах и метках в формате JSON.
Как проверить, запущена ли служба демона с помощью задания или скрипта Cron?
Как настроить задание cron для контроля нескольких PI (через SSH), которые используют тот же самый демон-демон (сервис)? Я думал об использовании задания cron для контроля состояния службы и записи в файл на моем сервере, если статус службы активен или неактивен, а затем я могу позже использовать содержимое этого файла для отображения результатов Cron работу на веб-странице (но это для меня, чтобы понять позже). Я открыт для других вариантов, если кто-то может найти более простой способ с помощью другого инструмента, например скрипт bash, скрипт python, PHP и т.д.
2 ответа
в RHEL/CentOS v4.x/5.x/6.x и Fedora Linux (более старая версия) Проверка службы Cron Вы можете просто использовать любую из следующих команд, чтобы увидеть, работает ли сбой или нет, введите:
# crond (pid 4370) is running.
$ chkconfig crond on $ service crond start
Заметка о CentOS/RHEL v7. x+ и последней версии Fedora Linux Вам нужно использовать следующую команду, чтобы узнать, работает ли ковер или нет:
$ systemctl status crond.service
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled) Active: active (running) since Tue 2015-05-19 14:53:32 EDT; 3min 7s ago Main PID: 1292 (crond) CGroup: /system.slice/crond.service â""â"€1292 /usr/sbin/crond -n
$ sudo systemctl enable crond.service $ sudo systemctl start crond.service
Заметка о службе Debian/Ubuntu Linux (более старая версия) Cron. На сервере Debian и Ubuntu Linux cron записывает свое действие в систему syslog, т.е. Использует файл /var/log/messages:
$ update-rc.d cron defaults $ /etc/init.d/cron start
Заметка о Debian Linux v8. x+ и последняя версия Ubuntu Linux Синтаксис выглядит следующим образом, чтобы проверить, запущена ли служба cron или нет:
â— cron.service - Regular background program processing daemon Loaded: loaded (/lib/systemd/system/cron.service; enabled) Active: active (running) since Tue 2015-05-19 11:49:32 IST; 12h ago Docs: man:cron(8) Main PID: 1053 (cron) CGroup: /system.slice/cron.service â"œâ"€1053 /usr/sbin/cron -f â""â"€3020 /usr/bin/atop -a -w /var/log/atop/atop_20150520 600
$ sudo systemctl enable cron.service $ sudo systemctl start cron.service