2013-05-30 2 views
18

Что такое команда linux, чтобы определить, работает ли процесс aa.sh или нет. Команда ps не работает, и она не отображает имена сценариев оболочки.Команда Linux, чтобы проверить, запущен ли сценарий оболочки или нет.

Просьба сообщить.

+0

'пс -ae' показывает SCRIPTNAME для меня. – nims

+3

'ps aux | grep scriptname' или' pgrep scriptname' –

+0

Или 'pidof', чтобы просто получить PID. – tripleee

ответ

19

Проверить это

ps aux | grep "aa.sh" 
+1

Это может дать вам некоторые сюрпризы, позвольте мне привести вам два примера одновременно. Во-первых: он найдет также «aaa.sh», что может привести к ошибкам. Во-вторых: grep найдет себя, с чем вам приходится иметь дело. Pgrep - элегантное решение. – user897079

+2

Мы можем использовать трюк, чтобы предотвратить появление grep: 'ps aux | grep "[a] a.sh" ' – Vassilis

0

Дайте возможность для пса, чтобы отобразить все процессы, пример может служить:

ps -A | grep "myshellscript.sh" 

Проверить http://www.cyberciti.biz/faq/show-all-running-processes-in-linux/ для получения дополнительной информации

И как Basile Starynkevitch упоминается в комментариях pgrep является еще одним решением.

4

Добавление к выше ответов -

Чтобы использовать в скрипте, используйте следующее: -

result=`ps aux | grep -i "myscript.sh" | grep -v "grep" | wc -l` 
if [ $result -ge 1 ] 
    then 
     echo "script is running" 
    else 
     echo "script is not running" 
fi 
+0

Если я запустил' ps aux | grep -i "myscript.sh" | grep -v "grep" | wc -l' alone, вывод равен 0. Если я запустил его в своем скрипте, результат будет равен 2, а сценарий будет завершен. Какие-нибудь предложения в чем-то не так? – Ahue

+0

один для скрипта, а один для самой grep. если вы попробуете 'ps aux | grep hello' в терминале, вы увидите grep как процесс. Чтобы предотвратить появление grep, я использую трюк: 'ps aux | grep [h] ello' – Vassilis

20

Самое простое решение:

pgrep -fl aa.sh 
+7

, если кто-то задавался вопросом, что это делает, [см. пояснения] (http://www.explainshell.com/explain?cmd=pgrep+-fl+aa.sh) – tutuDajuju

+1

@tutuDajuju: Полезно, спасибо ; небольшое касание: стоит обратить более пристальное внимание на службу, к которой вы ссылаетесь: http://explainshell.com может анализировать произвольные командные строки Unix и объяснять конкретные варианты, используемые на основе пользовательских страниц Ubuntu. Вот явный URL, объясняющий этот ответ: http://www.explainshell.com/explain?cmd=pgrep+-fl+aa.sh – mklement0

1

Решения abo ve отлично подходят для интерактивного использования, где вы можете увидеть результат и отбросить ложные срабатывания.

Ложные срабатывания могут возникать, если сам исполняемый файл подходит, или любые аргументы, не совпадающие с именами сценариев, - вероятность больше с сценариями, которые не имеют расширений имени файла.

Вот более надежный решение для сценариев а, используя функцию оболочки:

getscript() { 
    pgrep -lf ".[ /]$1(|\$)" 
} 

Пример использования:

# List instance(s) of script "aa.sh" that are running. 
getscript "aa.sh" # -> (e.g.): 96112 bash /Users/jdoe/aa.sh 

# Use in a test: 
if getscript "aa.sh" >/dev/null; then 
    echo RUNNING 
fi 
  • Совпадение чувствителен к регистру (на OSX , вы можете добавить -i к вызову pgrep сделать его случайным * в * чувствительным; на Linux, это не вариант.)
  • Функция getscript также работает с полными или частичными путями, которые включают компонент имени файла; частичные пути не должны начинаться с /, и каждый указанный компонент должен быть заполнен. «Полнее» заданный путь, тем ниже риск ложных срабатываний. Caveat: соответствие пути будет работать только в том случае, если скрипт был вызван с путём - это, как правило, справедливо для скриптов в $ PATH, которые вызываются напрямую.
  • Даже эта функция не может исключить все ложные срабатывания, поскольку пути могут иметь встроенные пространства, но ни ps, ни pgrep не отражают исходное цитирование, применяемое к командной строке. Все функции гарантируют, что любое совпадение - - не первый токен (который является интерпретатором), и что он встречается как отдельное слово, опционально которому предшествует путь.
  • Еще один подход к минимизации риска ложных срабатываний может заключаться в том, чтобы соответствовать исполняемому (например, интерпретатору, например bash) - при условии, что он известен; например
# List instance(s) of a running *bash* script. 
getbashscript() { 
    pgrep -lf "(^|/)bash(| .*/)$1(|\$)" 
} 

Если вы готовы сделать дальнейшие предположения - например, скрипт-интерпретатор пути никогда не содержащий пробелы - в регулярные выражения можно было бы сделать более ограничительный характер и тем самым еще больше снизить риск ложных срабатываний.

1
pgrep -f aa.sh 

Чтобы сделать что-то с идентификатором, вы его пропустите. Здесь я убиваю все свои дочерние задачи.

pgrep aa.sh | xargs pgrep -P ${} | xargs kill 

Если вы хотите, чтобы выполнить команду, если процесс запущен сделать это

pgrep aa.sh && echo Running 
1

я был весьма вдохновлен последним ответом на mklement0 - У меня есть несколько сценариев/небольшие программы, я бег на каждый перезагрузитесь через /etc/crontab. Я построил его ответ и создал сценарий входа, который показывает, все ли мои программы все еще запущены. Я выполняю это scripts.sh через .profile -файл при каждом входе в систему, чтобы получать мгновенное уведомление по каждому логину.

cat scripts.sh 
#!/bin/bash 

getscript() { 
    pgrep -lf ".[ /]$1(|\$)" 
} 

script1=keepalive.sh 
script2=logger_v3.py 

# test if script 1 is running 
if getscript "$script1" >/dev/null; then 
    echo "$script1" is RUNNING 
    else 
    echo "$script1" is NOT running 
fi 

# test if script 2 is running: 
if getscript "$script2" >/dev/null; then 
    echo "$script2" is RUNNING 
    else 
    echo "$script2" is NOT running 
fi 
1

Проверить это

ps -ef | grep shellscripname.sh 

Вы также можете найти запущенный процесс в

ps -ef 
Смежные вопросы