* [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