@alenov
Программист

Как с помощью ps найти основной дочерний процесс?

Я запускаю через cron скрипт на Питоне. Мне нужно в начале скрипта определить, нет ли активного процесса, чтобы не запускать его повторно, если ещё не отработал предыдущий запуск. Я решил посчитать кол-во работающих процессов, и если их больше одного, не запускать скрипт.
Ищу по имени команды. Вот что выдаёт ps:

10683 ?        Ss     0:00 /bin/sh -c . /home/master/.profile ; cd /var/www/site && python3 manage.py route
10685 ?        S      0:00 /var/www/site/venv/bin/python3 manage.py route


Процессов 2, что понятно. Нужно найти только тот процесс, который собственно и является "полезным", т.е. 10685
Конечно, можно учесть, что их будет минимум 2, но хочется по феншую. Как это сделать? И что означает S и Ss? Может, тут и решение?
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
@unseriously
S : процесс ожидает (т.е. спит менее 20 секунд)
s : лидер сессии
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@vitaly_il1
DevOps Consulting
Посмотрите на pgrep (https://linuxize.com/post/pgrep-command-in-linux/) - коротко и красиво
Ответ написан
Комментировать
@edo1h
плюс принцип "Не делай то, что не нужно делать"

ну так и надо использовать уже имеющуюся инфраструктуру, а не устраивать «закат солнца вручную»

вариант 1:
первая ссылка в гугле по «python pid file»:
https://pypi.org/project/python-pidfile/

вариант 2:
Да и условия эксплуатации скрипта - только cron.

независимо от нашего отношения в systemd, нам с ним жить. и этот функционал там из коробки:
https://unix.stackexchange.com/questions/203254/do...
так что если скрипт linux-only, я бы просто сделал запуск не из крона, а таймерами systemd, и пусть уже сам systemd следит завершился предыдущий экземпляр или нет.
Ответ написан
Комментировать
@MadridianFox
Web-программист, многостаночник
Обычно, проверка на то что программа уже запущена, делается через создание т.н. lock файла.
Вам нужно в начале работы скрипта проверить - создан ли файл.. ну например /var/www/site/manage.lock
если да, то завершить программу т.к. уже работает другой процесс,
если нет - создать такой файл, продолжить выполнение программы, а перед завершением удалить файл.

Если говорить об определении дочерних процессов, то у ps богатые возможности по фильтрации и форматированию вывода. Получить PID дочерних процессов зная PID родительского можно вот так:
ps --ppid=1234 -o pid
Ответ написан
@MechanID
Админ хостинг провайдера
В добавок к ответу unseriously
вы можете посомтреть древо процессов при помощи ps auxf
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы