[shell] перезапускалка для процесса

Andbar

Я в программировании под линуховый шелл не разбираюсь, максимум что могу - несколько команд скомпоновать. Может быть кто-нибудь подскажет, как сделать следующее?
Нужно в цикле каждые 5 минут проверять наличие процесса по имени. (тут проблема в том, что команда ps aux|grep имя, которую я обычно выполняю вручную, выдаёт иногда сам grep, а иногда - не выдаёт).
Если процесс не найден, нужно подождать ещё минуту, выполнить пару команд и вернуться к циклической проверке процесса.

Oper

ps aux | grep <имя процесса> | grep -v grep
:)

Oper

Вот пример:

#!/bin/bash

while [ true ]
do
sleep 1
x=`ps aux | grep firefox | grep -v grep`
if [[ $x != "" ]]
then
echo "Firefox started!"
fi
done

Ivan8209

> Нужно в цикле каждые 5 минут
crontab -e
> проверять наличие процесса по имени.
pkill -0
---
Q47: а где нетварь?
A47: скоро должна сдохнуть.

Ivan8209

> x=`ps aux | grep firefox | grep -v grep`
> if [[ $x != "" ]]
Тут ошибка.
> while [ true ]
Это, кстати, не менее гениально.
---
A24: Проявления suxx-а неисчислимы.

Andbar

гм... Вот так почему-то не работает:
if `ps aux | grep <имя процесса> | grep -v grep >/dev/null 2&>1`; then
....
else
.....
fi
Почему-то всегда выполняется ветка else.

Oper

В такой конструкции ps aux... должно быть без обратных кавычек.

Sharp

Daemon Tools тебе не помогут? http://cr.yp.to/daemontools.html

bansek

для джавы есть такая штука - javawrapper которая это делает
http://wrapper.tanukisoftware.org/doc/english/download.jsp

Ivan8209

> Почему-то всегда выполняется ветка else.
Горе-программисты...

$ cd /bin
$ `echo ls`
[ cpio domainname kill mt rcmd sleep
cat csh echo ksh mv rcp stty
chio date ed ln pax rm sync
chmod dd expr ls ps rmdir tar
cp df hostname mkdir pwd sh test
$

---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

Anturag


$ a="init"; if test -n "`pgrep -x $a`"; then echo started; else echo not started; fi

Ivan8209

Кавычки любишь?

a="init"; if test -n "`pgrep -x $a`"; then echo started; else echo not started; fi
if pgrep init; then echo started; else echo not started; fi

---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

Anturag

Любишь писать мусор в stdout? :grin:

serega1604

он уже давно написал правильную команду - pkill вместо ваших изварщений с grep/pgrep.

zya369

# which pkill
which: 0652-141 There is no pkill in ...

:crazy:

serega1604

uname -то хоть там есть?

Andbar

ну... мне повезло больше
melchior:~$ which pkill
/usr/bin/pkill

Vlad77

Это ты smbmount хочешь каждые 5 минут пинать или другую какую ерунду?
Лучше бы поспрашивал как iptables настроить, а не велосипеды с квадратными колёсами писал.

Ivan8209

> melchior:~$ which pkill
Мне тут недавно указали, что "which" --- это нестандартный бсдизм,
растущий из csh, а стандартное (POSIX) средство --- "command -v".
---
"This user is BSD-compliant."

Andbar

Спасибо всем, кто пытался помочь.
В итоге сделал так:
*/5 *  *   *   *     if pkill -0 _имя_процесса_ >/dev/null 2>&1;then echo "">/dev/null;else sleep 30s;....;fi
Пустая команда в ветке then - просто заглушка (как инвертировать выполнение в if, я не нашёл).
Ответ 'у: текущее положение дел с iptables меня пока устраивает (а больше никому мешать не может) и, следовательно, нормальный вариант представляет лишь теоретический интерес. А регулярно мониторить поисковик и делать одни и те-же действия для перезапуска уже немного надоело.

zya369

# uname -a
AIX ... 3 5 0002B555D600

:crazy:

Vlad77

поисковик
Его бинарник нужно либо в gdb, либо в /dev/null вместо того эха.
search.local почему не падает? Тоже постоянный reincarnation?

Andbar

мне самому не нравится это решение, но пока-что нет времени разбираться.

Ivan8209

> как инвертировать выполнение в if, я не нашёл

The format for a pipeline is:

[!] command1 [| command2 ...]

...

If the reserved word ! does not precede the pipeline, the exit status is
the exit status of the last command specified in the pipeline. Other-
wise, the exit status is the logical NOT of the exit status of the last
command. That is, if the last command returns zero, the exit status is
1; if the last command returns greater than zero, the exit status is
zero.

---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

Ivan8209

> echo "">/dev/null

Built-ins

...

: A null command that returns a 0 (true) exit value.

---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

serega1604

Whip me. Beat me. Make me maintain AIX.
— Stephan Zielinski

Andbar

А по каким словам это ищется в манах?

Ivan8209

man sh. Ты и программируешь так же, не зная ни грамматики
используемого языка, ни семантики его конструктов?
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Оставить комментарий
Имя или ник:
Комментарий: