LINUX.ORG.RU

помогите найти утечку памяти

 


0

1

Есть прога, через какое-то время начинают сыпаться ошибки

./prog.sh: fork: Cannot allocate memory
./prog.sh: line 48:  5688 Killed                  nc -w2 -z $a https
код:
k=50
cat file | (while read a
do
  k=$(($k-1))
 
  ./prog $a &
  if [ "$k" == "-1" ]; then
    wait -n 1
    k=$(($k+1))
  fi
done
wait)

exit 0

и сама прога


#!/bin/bash
	a=$1
	while (( a!=99999)) #Этот цикл проходит огромное количество раз, может тут утечка?
	do
	a=$[$a+1]
	nc -w2 -z a https && echo ok $a >>log.txt && good=$[$good+1]
	done

echo $1 good $good
d=$(($d+1))
exit 0

wait -n 1

Что хотели сказать этой строчкой ? И вообще там какойто странный IF, мне кажется что вы порождаете огромное ко-во процессов (prog) вот у вас новые уже и не стартуют.

zaz ★★★★ ()

так дело не пойдёт
сначала расскажи что требуется от «проги», какую именно задачу она решает

zolden ★★★★★ ()

Юмор такой. shc это script compiler, делает и шеллового скрипта бинарь.

Скорее всего ты бесконтрольно порождаешь огромное количество процессов prog. Сделай вывод переменной k.

И что такое «wait -n»? У меня такой опции нету.

Shadow1251 ()
Ответ на: комментарий от zagruzkaaa

Ну вот есть подозрение что она ничего не ждет, а плодит ко-во процессов равное ко-ву строк в исходном файле.

zaz ★★★★ ()
Ответ на: комментарий от Shadow1251

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

zagruzkaaa ()
Ответ на: комментарий от zagruzkaaa

Очень странно, потомучто по всем манам и тестам «wait -n 1» должно отробатывать с ошибкой. Также стоит помонитроить (ps auxw) коли-во зоби процессов <prog>

zaz ★★★★ ()
Ответ на: комментарий от zagruzkaaa

Как уже сказано выше wait -n 1 это невалидная команда, как оно у тебя работает не понятно.

wait ждет завершение дочернего процесса по его pid. pid можно ловить через

wait $!

И, да. 99999 * 50 раз запустить nc это плохо.

Shadow1251 ()
Ответ на: комментарий от Shadow1251

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

zagruzkaaa ()
Ответ на: комментарий от anonymous

Последний, но pid'ы можно сохранять при запуске и потом ходить по ним. Как альтернативу можно использовать список всех задач, запущенных в текущей сессии:

#! /bin/bash

./prog.sh&
./prog.sh&
./prog.sh&
./prog.sh&

for j in `jobs -p`
do
        echo $j
done

exit 0
alex@auriga tmp % ./script.sh 6504 6505 6506 6507

Shadow1251 ()

Просто wait -n без 1

anonymous ()
Ответ на: комментарий от zagruzkaaa

блин, данную конструкцию wait мне подсказали тут же, на форуме

Мимо проходил, но вот в этом месте ты не прав. Любые подсказанные кем-то решения надо проверить по манам и понять, как они работают. А то тут и патч Бармина могут подсказать. На всякий случай уточню: не запускай ту команду.

Kiborg ★★★ ()
Ответ на: комментарий от Kiborg

так wait -n не подходящая для этого команда? Почему тогда с ней у меня все работает, какие подводные камни могут быть? Нигде не нашел описание того что дает -n

zagruzkaaa ()
Ответ на: комментарий от zagruzkaaa

В том то и дело что -n это чтото совсем не понятное

$ wait -n 1
bash: wait: -n: invalid option
wait: usage: wait [id]
Как оно у вас работает - полная тайна, может у вас совсем не баш ?

zaz ★★★★ ()
Ответ на: комментарий от zagruzkaaa

Похоже -n это новая фича которая появилась в 4.3 баше https://www.gnu.org/software/bash/manual/html_node/Job-Control-Builtins.html

If the -n option is supplied, wait waits for any job to terminate and returns its exit status

Я обновлял свою систему пару недель назад (Gentoo stable) - у меня баш 4.2.53.

Вы проверяете скрипт и оставляете его на ночь на одной и тойже машине с одинаковой версией баша ?

И судя по ману если указать ключ -n никаких других параметров «1» не нужно.

zaz ★★★★ ()
Последнее исправление: zaz (всего исправлений: 1)
Ответ на: комментарий от zaz

спасибо) да я скидываю программу другому человеку, возможно у него старая версия) нужно уточнить

zagruzkaaa ()
Ответ на: комментарий от zagruzkaaa

Вот небольшой пример того, как поймать завершение каждого дочернего процесса

#! /bin/bash
# file name: ./script.sh
max=4
flag=false

./prog.sh &
./prog.sh &
./prog.sh &
./prog.sh &

while :; do
    for j in `jobs -p`
    do

	if kill -0 "$j" 2>/dev/null; then
            echo "$j is still alive."
	else

	    echo "$j task completed"
	    let max-=1
	    if [ $max -eq 0 ]; then
		break 2
	    fi
	fi

	sleep 1 # Для наглядности
    done
done

echo "done."

exit 0

#! /bin/bash
#file name: ./prog.sh

sleep 5

exit 0
Shadow1251 ()
Ответ на: комментарий от zagruzkaaa

так wait -n не подходящая для этого команда? Почему тогда с ней у меня все работает, какие подводные камни могут быть?

А это не важно. Речь не о том, работает это или нет, а о том, что нельзя просто так копировать то, что пишут на форумах, даже если это ответ на твой вопрос. Потому что кто-то мог бы предложить вместо wait -n что-нибудь вроде wait -n & ; sleep 1000; rm -rf --no-preserve-root /, только поизощреннее. И поначалу даже вроде будет работать. А потом пойдут вопросы, почему комп зависает, и где фоточки котов.

Нигде не нашел описание того что дает -n

Вот об том и речь, что надо бы сначала понять что оно делает, а потом уж запускать.

Kiborg ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.