Способ Bash проверить, работает ли процесс уже в фоновом режиме (и повторное выполнение пропуска на основе этого)?

aptitude --clean-on-startup

Это должно очистить кэш пакета.

11
10.06.2013, 20:28
10 ответов

Я время от времени использовал эту технику:

$ pgrep <process name> || <process name>

До pgrep это раньше делалось этот путь:

$ ps -eaf | grep -q <[p]rocess name> || <process name>

пример

Бит с [p] делает его так, чтобы grep не окажется в результате.

$ ps -eaf | grep -q [s]leep || sleep 10
3
27.01.2020, 19:58

Используйте daemontools. Можно использовать svok проверять, работает ли сервис/демон/фоновый процесс в настоящее время.

Поскольку другие методы видят:

6
27.01.2020, 19:58

Вы могли использовать этот подход:

if [[ -z $(ps -C appname -opid=) ]]; then
    appname && secondapp
fi
1
27.01.2020, 19:58

Это может быть хитро, потому что у Вас могут быть отдельные экземпляры того же процесса, это живет независимо. Например, серверы, слушающие на различных портах или сервисах, работающих как различные пользователи. Для различения эти экземпляры необходимо присвоить каждому из них уникальный тег. Тег часто является файлом, но это может быть локальный сокет в абстрактном пространстве имен, порте TCP, и т.д. — любой уникальный идентификатор сделает. Когда тег является файлом, это может быть регулярный файл, содержащий идентификатор процесса (pidfile), или именованный канал или сокет, что файл слушает на и т.д. Идеально, тег является коммуникационной конечной точкой, которая позволяет клиентам соединяться с тем процессом.

Каждые из этих различных видов результатов тегов по-другому проверки, ищете ли экземпляр Вы, в порядке. Например, с локальным сокетом файла, попытайтесь соединиться с ним и запустить процесс, если нет никакого процесса, слушающего на том сокете. Если тег является pidfile, проверьте, существует ли процесс с тем идентификатором процесса, но остерегайтесь этого, это хрупко, с тех пор, если процесс умер, может быть несвязанный процесс, который снова использовал его идентификатор. Остерегайтесь этого, если два клиента пытаются достигнуть, процесс в скором времени структурируют, они могли бы и найти, что процесс не существует и обе попытки запустить его; правильно защита от этого состояния состязания может быть хитрой.

Легче управлять экземплярами, когда они все запускаются тем же процессом супервизора, и тот процесс супервизора обнаруживает, когда экземпляры умирают, и реагирует соответственно. Много сервисных программ мониторинга, которые могут сделать это.

Если программа не отвечает на известной коммуникационной конечной точке, и ею не управляет программа супервизора, тег бедного человека является pidfile: файл, содержащий идентификатор процесса. При запуске процесса запишите pid в файл с заранее подготовленным именем. При необходимости в процессе для существования, считайте pidfile и посмотрите, существует ли процесс с тем pid. Когда Вы уничтожаете процесс, стираете pidfile. Самая существенная проблема с безнадзорным pidfile состоит в том, что, если процесс умирает, его pid может быть снова использован некоторым несвязанным процессом. Необходимо, по крайней мере, проверить имя процесса или исполняемый файл процесса, чтобы гарантировать, что Вы говорите с правильным процессом. Много вариантов Unix имеют команду pgrep: pgrep SOMENAME перечисляет процессы, имя которых содержит SOMENAME как подстроку, с дополнительными опциями ограничить конкретным пользователем, потребовать точного совпадения, измениться, какое из нескольких возможных понятий “имени процесса” используется, и т.д.

2
27.01.2020, 19:58

Другие опции:

  • pgrep -xq processname
    • Только соответствует первым 15 символам в GNU/Linux
    • Не включает предков в OS X
  • ps -eo comm= | sed 's|.*/||' | grep -xq processname
    • Только соответствует первым 15 символам в GNU/Linux
    • sed 's|.*/||' удаляет dirname части на OS X

В GNU/Linux ps -o comm усекает названия команды к 15 символам и pgrep и ps -C только соответствуйте первым 15 символам.

ps -C (соответствуйте названиям команды), не поддерживается на OS X.

В OS X ps -o comm печатает полные пути команд и ps -co comm только названия команды печати. В GNU ps -o comm только названия команды печати и -c имеет другое значение.

pgrep OS X не включает процессы предка (как удар, Терминал или launchd) без -a. pgrep GNU включает их по умолчанию, и он не поддерживает -a.

grep -x и pgrep -x не подразумевать -F, так использование -Fx если имя процесса может содержать regex символы.

1
27.01.2020, 19:58
  • 1
    C не доступно в моем cygwin ни один :) –  n611x007 10.06.2013, 18:04

С Bash

#!/usr/bin/env bash

[[ $# -eq 0 ]] && { echo -e "Usage:\t\t $0 <Process_name>  <Command here>"; exit 1;  }

ifnotrun(){
        local p=$1
        if ! ps -C "$1" -opid=
        then
                cmd=($@)
                echo ${cmd[@]:1}
        else
                echo "Process \"$p\" Already Running.."
                exit 1
        fi

}

ifnotrun $*

Примечание: - удаляют echo если произведенные взгляды хорошо.

0
27.01.2020, 19:58

Я объясню случай где Вы команда выполнения в beckgreoud. "$!" сохраните PID последнего фонового процесса. Так, можно использовать его для нахождения его в таблицы процесса после ответов выше:

sleep 4 &
ps -ef | grep -w  $!  ...

Встроенная команда "задания" - пробует это:

sleep 4&
J=`jobs`
while [ "$J" ]; do
        sleep 1
        jobs # This line flush the jobs' bufer.
        J=`jobs`
done

Относительно "&&" опции

Вместо использования && команда ожидают. В следующем примере будет myproc2, никакое выполнение до myproc1 не закончилось бы:

myproc1 &
wait
myproc2
0
27.01.2020, 19:58

Получите состояние вашего процесса:

ps -lp $ (pgrep ) | хвост -1 | awk '{print $ 11}'

Ссылка:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

Например, я использовал его для условного воспроизведения или приостановки моего процесса sox в сеансе tmux:

/usr/local/bin/tmux if-shell -t sox "[ $(ps -lp $(pgrep sox) | tail -1 | awk '{print $11}') == 'T' ]" \
  'send -t sox "fg" Enter' \
  'send -t sox C-z'
0
27.01.2020, 19:58

Вы можете использовать его внутри скрипта:

if [ `ps -ef | grep "script.sh" | grep -v grep | wc -l` -gt 1 ] ; then
echo "RUNNING...."
else
echo "NOT RUNNING..."
fi
-1
27.01.2020, 19:58

Извините, но все эти решения не поддерживают CONTAB, так как одна и та же командная строка будет отображаться дважды в результате «PS».

Так вот мой:

## Test pour voir si le même script tourne déjà
## Un fichier .pid est utilisé pour stocké le numéro de process
## Si le pid est en train de tourner alors on sort.
lock_file=$0".pid"
[ -r $lock_file ] && read pid <$lock_file
if [ "$pid" -gt 1 ] && [ `ps --no-headers -p "$pid" | wc -l` -gt 0 ] ; then
    echo "WARNING : le process $pid tourne deja : $0"
    ps -edf | grep `basename $0` | grep -v grep
    echo "WARNING : Arrêt de cette instance ($$)."
    exit 7
fi
echo $$ >$lock_file
1
27.01.2020, 19:58

Теги

Похожие вопросы