LINUX.ORG.RU

Получить имя процесса, зная его pid

 


0

1

Всем доброго времени суток.

Задача следующая - хочу, чтобы в системе одновременно работал только 1 экземпляр моего демона. Для этого при старте создаю pid-файл, при корректном завершении удаляю его. Все работает.

Но вот что делать, если демон завершается некорректно? Хочу при последующем старте не только проверять наличие pid-файла, но и то, какой процесс сейчас живет (если живет) с этим pid-ом.

Проверку провожу из bash-скипта. Была идея читать /proc/${pid}/status, но я не силен в выделении подстрок на bash (не понял, как получить имя из «Name: ${procname}»). Есть еще варианты? Или подскажите, как распарсить эту несчастную строку.

★★

Ответ на: комментарий от AnDoR

Да, стыдно было об этом не знать. Сейчас ознакомлюсь...

solovey ★★
() автор топика
Ответ на: комментарий от backbone

Через pgrep сделано сейчас. Работает как-то коряво... Скорее всего, это опять же мои косяки. Хотел сделать другим способом

solovey ★★
() автор топика
Ответ на: комментарий от post-factum

ну у меня debian древний... И с ядром мне ковыряться лень. Точнее - не до того. Машина рабочая. Живет, и ладно. Всякие эксперименты я дома ставлю...

solovey ★★
() автор топика
Ответ на: комментарий от solovey

По сути, тебе ведь не нужно проверять, какой процесс живёт с этим пидом. Достаточно сделать pgrep по имени процесса, и если результат пустой, то это значит, что процесс не выполняется.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum

Каждый раз, когда я вижу «grep | awk», мне хочется убить котенка, потому что

1. cat /proc/self/status | awk '/^Name:/ {print $NF}'

2. cat /proc/self/status | sed -nre 's/^Name:[[:space:]]*(.*)$/\1/p'

3. ps -p $pid -o comm= — what op really wants, потому что попытка самостоятельно парсить /proc заведомый фейл

red_eyed_peguin
()
Ответ на: комментарий от post-factum

В том то и дело, что нужно знать, что за процесс. Ведь если это мой демон, то мне не надо запускать его еще раз. А если это какой-то другой процесс, то у меня в pid-файле устаревшие данные, и демона нужно запускать.

Как-то так.

solovey ★★
() автор топика
Ответ на: комментарий от red_eyed_peguin

Ок, учту что «grep | awk» - не рационально

solovey ★★
() автор топика
Ответ на: комментарий от post-factum

я имею ввиду, не его демон, а другой какой-то процесс с тем пидом, что у него записан. тогда демон надо запустить, несмотря на то что процесс с таким пидом есть.

val-amart ★★★★★
()
Ответ на: комментарий от post-factum

Да, именно к этому я в результате и пришел.

Лишний раз убеждаюсь, что сначала надо для себя грамотно сформулировать задачу.

Еще раз спасибо.

solovey ★★
() автор топика

То, что ты хочешь, делается lock-файлами, а не проверками из баша какое имя процесса у данного pid'а.

anonymous
()
Ответ на: комментарий от solovey

Достаточно проверить, нет ли процесса с pid'ом из lock-файла. Если есть - прочесть его имя. Если оно «левое» - смело затирать lock-файл своим.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от post-factum

Если записывать pid, получается быстрей (т.к. проверяется только данный pid).

Вариант без pid'ов я делал: процесс при запуске читает все дерево /proc, выискивая (как pgrep - собственно, оттуда код я и спер) одноименные процессы. Если ни одного не найдено, все ОК - процесс считает себя сервером. Если найдено и явно не указано, что процесс - клиент, он благополучно подыхает.

Eddy_Em ☆☆☆☆☆
()
19 июня 2012 г.
Ответ на: комментарий от megabaks

Ну нихуяж себе, ты таки осилил открыть man awk?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.