Який правильний спосіб перевірити, чи працює PID?


12

У мене є .pidфайл, і мені потрібно перевірити, чи працює процес. Поки що я знайшов два варіанти

kill -0 `cat something.pid`

яка видає помилку, якщо pid не працює. Я знаю, що це можна переспрямувати /dev/null, але це змушує мене думати, що це не найкраще рішення.

Другим рішенням буде використання ps, яке, однак, також друкує на STDOUT

ps -ef `cat something.pid`

Чи нормально переадресовувати вихід /dev/nullі просто використовувати код статусу, який повертається, або це знак того, що я щось роблю не так і мені потрібна інша команда?


5
Використовуйте kill -0як стандарт (POSIX)-сумісний.
Андерс

Відповіді:


10

для більшості дистрибутивів Linux перерахування / proc / {pid} є хорошим способом отримання інформації про запущені процеси, і зазвичай про те, як команди користувальницького простору, як "ps", спілкуються з ядром. Так, наприклад, ви можете зробити;

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

Редагувати: ви повинні перевірити, чи встановлено kpid, але це корисніше, оскільки він поверне "не існує" для unset $ {kpid}

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

@SteveMuster Це зробить відповідь специфічним для Linux. На OSX немає / proc. І я думаю, що на BSD немає / proc.
попел

Зверніть увагу на це, вам потрібно переконатися, що ${kpid}існує
Вільф

@Wilf я відредагував його, тому він повертає "процес не існує" для невідомих $ {kpid}
Tom H

Дякую - я робив сценарій, який перевіряє PID за аналогічним методом, і він не працював, поки я не виявив, що це проблема :)
Wilf

6

Як зазначив Андерс, вам слід скористатися kill -0для дотримання POSIX.

У системах Linux ви також можете перевірити наявність файлу у файловій системі / proc, наприклад,

-f /proc/$(cat something.pid)/status

1

Якщо це в сценарії (я вважаю, що це так, коли ви турбуєтесь про друк до stdout), то наступним було б те, як ви могли це зробити:

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

У ps -pвиглядає для процесу з PID , зазначеної в something.pid ( $()синтаксис трохи більше нова версія лапки. Лапки необхідно уникнути при певних обставинах, нова форма не робить). Для 2>&1цієї команди також переспрямовується stderr.

Якщо ps -pкоманда не знаходить процес з цим PID, вона завершується з помилкою> 0, і тому elseвиконується виконання. Інакше killзаява. Ви можете заперечити вищезазначене, якщо хочете:

if ! ps -p ...

Сподіваємось, що відповість на ваше запитання. Очевидно, будьте обережні і багато перевіряйте, використовуючи небезпечні команди, такі як kill.


1

Ось кілька варіантів:

  • Якщо ви пишете init-script (наприклад, той, який потрібно розмістити /etc/init.d/), і якщо ви використовуєте дистрибутив на базі Debian, краще використовувати start-stop-daemon:
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    Ви повинні отримати код виходу 0, якщо він працює.
  • Ви можете використовувати pgrep та pkill з procpsпакету:
    pgrep --pidfile $PIDFILE

0

Якщо у вас є pid-файл, ви можете використовувати pgrep, щоб перевірити, чи працює процес:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.