Як я можу визначити, запущений процес чи ні, а потім мати сценарій bash, який виконує деякі речі на основі цієї умови?
Наприклад:
якщо процес
abc
запущений, зробіть цеякщо він не працює, зробіть це.
Як я можу визначити, запущений процес чи ні, а потім мати сценарій bash, який виконує деякі речі на основі цієї умови?
Наприклад:
якщо процес abc
запущений, зробіть це
якщо він не працює, зробіть це.
Відповіді:
Баш сценарій, щоб зробити щось подібне, виглядатиме приблизно так:
#!/bin/bash
# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern.
if pgrep -x "gedit" > /dev/null
then
echo "Running"
else
echo "Stopped"
fi
Цей скрипт просто перевіряє, чи працює програма "gedit".
Або ви можете перевірити, чи програма не працює так:
if ! pgrep -x "gedit" > /dev/null
then
echo "Stopped"
fi
/dev/null
: "/ dev / null перенаправляє стандартний висновок команди на нульовий пристрій, який є спеціальним пристроєм, який відкидає інформацію, написану на ньому" ... за допомогою 0
перенаправлення виводу команди на названий файл 0
. У цьому випадку я б радив стати більш комфортним > /dev/null
- ви побачите це всюди, оскільки це стандартний / правильний спосіб відкинути вихід.
-x
параметр, щоб pgrep
він шукав точну програму, інакше він отримає помилковий правильний випадок, якщо знайде ту саму рядок у назві іншого додатка. Я просто витратив 1 годину, щоб знайти це.
! pgrep
Будь-яке рішення, яке використовує щось на кшталт ps aux | grep abc
або pgrep abc
є недоліком.
Оскільки ви не перевіряєте, чи працює певний процес, ви перевіряєте, чи є якісь запущені процеси, які відповідають abc
. Будь-який користувач може легко створити та запустити виконуваний файл з іменем abc
(або який міститься abc
десь у його імені чи аргументах), що спричинить помилковий позитив для вашого тесту. Є різні варіанти , які можна застосувати до ps
, grep
і pgrep
звузити область пошуку, але ви все одно не отримаєте надійний тест.
Це залежить від того, для чого вам потрібен тест.
Для цього потрібні init та upstart. Вони запускають службу та забезпечують її збереження в pidfile. Спробуйте запустити послугу ще раз (через init або upstart), і вона перевірить pidfile, або запустити його, якщо його немає, або перервати, якщо він вже працює. Це все ще не на 100% надійно, але воно настільки ж близьке, як ви отримаєте.
Див. Як я можу перевірити, чи все ще працює мій ігровий сервер ... для інших рішень.
У цьому випадку використовуйте файл lockck або lockdir. Напр
#!/usr/bin/env bash
if ! mkdir /tmp/abc.lock; then
printf "Failed to acquire lock.\n" >&2
exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT # remove the lockdir on exit
# rest of script ...
Інші способи блокування див. У розділі " Bash FAQ" 45 .
pgrep
або ps
є цілком адекватним, і ваш підхід здається непосильним. Якщо ви пишете сценарій для публічного розповсюдження, вам слід написати його найбезпечнішим можливим способом.
rm
команда виконується. Тому поки він закінчується після встановлення пастки, блокування не повинно бути.
Це те, що я використовую:
#!/bin/bash
#check if abc is running
if pgrep abc >/dev/null 2>&1
then
# abc is running
else
# abc is not running
fi
Простий англійською мовою: якщо 'pgrep' повертає 0, процес запущений, інакше це не так.
Пов'язане читання:
Баш-сценарій :: Порівняння рядків
Посібники Ubuntu pgrep
pgrep
має той самий 15-ти символьний ліміт "особливості", який згадувався раніше, таким чином, наприклад pgrep gnome-power-manager
, також не вдасться
-x
опцію pgrep : "Тільки відповідати процесам, чиє ім'я (або командний рядок, якщо вказано -f) точно відповідає шаблону."
У мене зазвичай є pidof -x $(basename $0)
сценарії, щоб перевірити, чи він вже працює.
Визначаючи ідею @ rommel-cid, ви можете використовувати pidof
з || (||) запустити команду, якщо процес не існує, і && запустити щось, якщо процес існує, таким чином створивши швидку умову if / then / else. Наприклад, ось такий із запущеним процесом (мій браузер Chrome, назва якого процес "chrome") та тестування процесу, який не існує. Я придушив стандартний вихід за допомогою 1> / dev / null, щоб він не друкував:
$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
instead"
it's not running? ok i'll run instead
$
Жодне з "простих" рішень не працювало для мене, тому що бінарний файл, який мені потрібно перевірити, не встановлюється загальносистемно, тому мені доводиться перевіряти шлях, який, в свою чергу, вимагає використання ps -ef | grep
підходу:
app="$_sdir/Logic 1.2.18 (64-bit)/Logic"
app_pid=`ps -ef | grep "$app" | awk '{print $2}'`
if `ps -p $app_pid > /dev/null`; then
echo "An instance of logic analyzer is appear to be running."
echo "Not starting another instance."
exit 5
else
nohup "$app" &> /dev/null &
fi
Перше, що мені прийшло в голову щодо вашої проблеми:
ps aux | grep -i abc
покаже подробиці процесу, якщо його запуск. Ви можете збігати кількість рядків або час, за який він працює, і порівняти з нулем або будь-якими іншими маніпуляціями. Коли ви запустите вищевказану команду, вона покаже вам принаймні один рядок виводу, тобто детальну інформацію про процес, створений командою th grep. Тому подбайте про це.
Це повинно бути простим злом. Помістіть його в сценарій bash і подивіться, чи корисно це.
Використання start-stop-daemon
:
/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2
Він працює як звичайний користувач.
Я виявив, що прийнята відповідь, опублікована @John Vrbanac, не працює для мене, і що відповідь, опублікована @geirha, не відповідає на початкове запитання.
Рішення Джона Врбанака не спрацювало, щоб перевірити, запущений чи PHP процес для мене, я запускаю CentOS 7.
Відповідь @ geirha лише гарантує, що примірник не запущений до запуску іншого. Це не було початкове запитання, оригінальне запитання - перевірити, запущений процес чи ні.
Ось що для мене спрацювало:
Скажімо, у моєму процесі в його назві був рядок "Jane". Це виявить, працює він чи ні. Це працює для сценаріїв BASH та PHP.
ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
echo "It's running"
else
echo "It's not running"
fi
## bash
## function to check if a process is alive and running:
_isRunning() {
ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}
## example 1: checking if "gedit" is running
if _isRunning gedit; then
echo "gedit is running"
else
echo "gedit is not running"
fi
## example 2: start lxpanel if it is not there
if ! _isRunning lxpanel; then
lxpanel &
fi
## or
_isRunning lxpanel || (lxpanel &)
Примітка : pgrep -x lxpanel
або pidof lxpanel
як і раніше звіти, які lxpanel
працюють, навіть коли вони не працюють (зомбі); тож, щоб активувати живий процес, нам потрібно використовувати ps
іgrep
Станом на 23 вересня 2016 р. Для pgrep потрібен варіант "-x", щоб сценарій муру працював.
#!/bin/bash
if pgrep -x "conky" > /dev/null 2>&1
then
echo "conky running already"
else
echo "now starting conky"
conky
fi
exit 0
Я спробував і випробував вищевказаний скрипт на машині Ubuntu 16.04.1. Насолоджуйтесь!
#!/bin/bash
while [ true ]; do # Endless loop.
pid=`pgrep -x ${1}` # Get a pid.
if [ -z $pid ]; then # If there is none,
${1} & # Start Param to background.
else
sleep 60 # Else wait.
fi
done
zombie
процес "(не те, що я б назвав" запущеним "процесом). Повний список того , щоSTAT
значення стовпця, у висновкуps
, вказує на це тут для тих , хто схильний писати відповідь , який пристосовує це, або редагувати їх самостійно.