ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] shell programming
@ 2011-01-21 10:01 Денис Смирнов
  2011-01-21 10:18 ` Alexey Tourbin
  0 siblings, 1 reply; 7+ messages in thread
From: Денис Смирнов @ 2011-01-21 10:01 UTC (permalink / raw)
  To: ALT Linux Team development discussions

[-- Attachment #1: Type: text/plain, Size: 1283 bytes --]

Задача -- выполнить некоторую функцию в shell-скрипте, и если вдруг эта
функция выполняется больше 5-и секунд -- прибить ее нафиг и выполнить
другую. Как это сделать?

Дело в том что у меня проблема -- астериск на одной системе у меня
частично дедлочится. Запустил скрипт, который тестирует его на живучесть,
и если сдох -- делает coredump и убивает астериск (его потом daemontools
сам перезапускает).

Но по информации из coredump найти точно виновника сложно (ибо многие
треды по разным причинам держат какие-либо локи). А астериска есть
встроенная диагностика для локов, но когда астериск дедлочится с некоторой
вероятностью может залочиться и на обращении к нему за этой информацией.

Все это происходит на машине, на которой если после дедлока он не оживет
через 10 секунд мне оторвут голову :)

Единственное решение которое вижу -- это попытаться спросить всю
отладочную информацию у астериска, а если эта попытка залочилась --
прибить и ее, и астериск.

А с учетом того что для астериска 1.8 судя по багтрекеру дедлочиться это
вообще нормальное явление, я бы хотел сделать это решение по самоотладке
еще и дистрибутивным :)

-- 
С уважением, Денис

http://mithraen.ru/
----------------------------------------------------------------------------

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] shell programming
  2011-01-21 10:01 [devel] shell programming Денис Смирнов
@ 2011-01-21 10:18 ` Alexey Tourbin
  2011-01-21 10:20   ` Alexey Tourbin
                     ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Alexey Tourbin @ 2011-01-21 10:18 UTC (permalink / raw)
  To: ALT Linux Team development discussions

On Fri, Jan 21, 2011 at 01:01:56PM +0300, Денис Смирнов wrote:
> Задача -- выполнить некоторую функцию в shell-скрипте, и если вдруг эта
> функция выполняется больше 5-и секунд -- прибить ее нафиг и выполнить
> другую. Как это сделать?

func &
finished=

for 1 2 3 4 5; do
	sleep 1
	if ! kill -0 $!; then
		wait
		finished=1
	fi
done

if [ -z "$finished" ]; then
	echo >&2 killing func
	kill $!
	wait
fi


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] shell programming
  2011-01-21 10:18 ` Alexey Tourbin
@ 2011-01-21 10:20   ` Alexey Tourbin
  2011-01-21 15:28     ` Денис Смирнов
  2011-01-21 10:29   ` Sergei Epiphanov
  2011-01-21 11:29   ` Sergei Epiphanov
  2 siblings, 1 reply; 7+ messages in thread
From: Alexey Tourbin @ 2011-01-21 10:20 UTC (permalink / raw)
  To: ALT Linux Team development discussions

On Fri, Jan 21, 2011 at 01:18:29PM +0300, Alexey Tourbin wrote:
> On Fri, Jan 21, 2011 at 01:01:56PM +0300, Денис Смирнов wrote:
> > Задача -- выполнить некоторую функцию в shell-скрипте, и если вдруг эта
> > функция выполняется больше 5-и секунд -- прибить ее нафиг и выполнить
> > другую. Как это сделать?
> 
> func &
> finished=
> 
> for 1 2 3 4 5; do
> 	sleep 1
> 	if ! kill -0 $!; then
> 		wait
> 		finished=1
		break
> 	fi
> done
> 
> if [ -z "$finished" ]; then
> 	echo >&2 killing func
> 	kill $!
> 	wait
> fi


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] shell programming
  2011-01-21 10:18 ` Alexey Tourbin
  2011-01-21 10:20   ` Alexey Tourbin
@ 2011-01-21 10:29   ` Sergei Epiphanov
  2011-01-21 10:56     ` Alexey Tourbin
  2011-01-21 11:29   ` Sergei Epiphanov
  2 siblings, 1 reply; 7+ messages in thread
From: Sergei Epiphanov @ 2011-01-21 10:29 UTC (permalink / raw)
  To: ALT Linux Team development discussions

Может, так лучше?

finished=

func() {
        <что-то>
        finished=1
}

func &

for 1 2 3 4 5; do
        sleep 1
        if [ -n "$finished" ]; then
                wait
                break
        fi
done

if [ -z "$finished" ]; then
        echo killing func >&2
        kill $!
        wait
fi

-- 
С уважением, Епифанов Сергей

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] shell programming
  2011-01-21 10:29   ` Sergei Epiphanov
@ 2011-01-21 10:56     ` Alexey Tourbin
  0 siblings, 0 replies; 7+ messages in thread
From: Alexey Tourbin @ 2011-01-21 10:56 UTC (permalink / raw)
  To: ALT Linux Team development discussions

On Fri, Jan 21, 2011 at 01:29:38PM +0300, Sergei Epiphanov wrote:
> Может, так лучше?
> 
> finished=
> 
> func() {
>         <что-то>
>         finished=1
> }
> 
> func &

Нет. :)

Функция func теперь будет выполняться в родительском процессе (subshell),
$! - это номер процесса, который вернул fork(2).  Переменные между
процессами не разделяются.

> for 1 2 3 4 5; do
>         sleep 1
>         if [ -n "$finished" ]; then
>                 wait
>                 break
>         fi
> done
> 
> if [ -z "$finished" ]; then
>         echo killing func >&2
>         kill $!
>         wait
> fi


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] shell programming
  2011-01-21 10:18 ` Alexey Tourbin
  2011-01-21 10:20   ` Alexey Tourbin
  2011-01-21 10:29   ` Sergei Epiphanov
@ 2011-01-21 11:29   ` Sergei Epiphanov
  2 siblings, 0 replies; 7+ messages in thread
From: Sergei Epiphanov @ 2011-01-21 11:29 UTC (permalink / raw)
  To: ALT Linux Team development discussions

В сообщении от 21 января 2011 13:18:29 автор Alexey Tourbin написал:
> for 1 2 3 4 5; do

У меня bash на этом куске заругался, пришлось писать в виде

for i in 1 2 3 4 5; do

-- 
С уважением, Епифанов Сергей

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [devel] shell programming
  2011-01-21 10:20   ` Alexey Tourbin
@ 2011-01-21 15:28     ` Денис Смирнов
  0 siblings, 0 replies; 7+ messages in thread
From: Денис Смирнов @ 2011-01-21 15:28 UTC (permalink / raw)
  To: ALT Linux Team development discussions

[-- Attachment #1: Type: text/plain, Size: 962 bytes --]

On Fri, Jan 21, 2011 at 01:20:09PM +0300, Алексей Турбин wrote:
Спасибо! Работает! Ура!

Вопрос,  не мог бы ты пояснить вот этот код? С совсем не понимаю что тут за хитрое изобретени с exit trap.

#!/bin/bash
HOST=bla-bla-bla

trouble () {
        trap - EXIT
        kill $id
        date
#       /usr/sbin/rasterisk -x 'core show uptime'
#       /usr/sbin/rasterisk -x 'core show locks'
        gdb  -x gdb.cmd --batch asterisk $(cat /var/run/asterisk/asterisk.pid)
        killall -9 asterisk
        exit
}

trap 'echo trouble ; trouble >/tmp/$(date "+asterisk-restart-%Y-%m-%d-%s").txt' EXIT
(trap - EXIT; sleep 10; kill $$) &
id=$!
if /usr/bin/sipsak -s sip:nobody@$HOST
then
    kill $id
    trap - EXIT
    exit
fi
#
trap - EXIT
trouble >/tmp/$(date "+asterisk-restart-%Y-%m-%d-%s").txt
exit


-- 
С уважением, Денис

http://mithraen.ru/
----------------------------------------------------------------------------

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-01-21 15:28 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-21 10:01 [devel] shell programming Денис Смирнов
2011-01-21 10:18 ` Alexey Tourbin
2011-01-21 10:20   ` Alexey Tourbin
2011-01-21 15:28     ` Денис Смирнов
2011-01-21 10:29   ` Sergei Epiphanov
2011-01-21 10:56     ` Alexey Tourbin
2011-01-21 11:29   ` Sergei Epiphanov

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git