Имя: Пароль:
IT
 
Тест (на слабо)
0 Fragster
 
гуру
12.08.09
22:02
поймите, что делает этот код, и сделайте красивее:

#!/bin/bash

# список чего-нить
list="mail.ru ya.ru google.ru mista.ru"

i=1

# функция обработки
test() {
 echo start $1
 ping -c 3 $1 > /dev/null
 echo end $1
}

# параметр - количество одновременных процессов
limit=$1
a=1
while true
do
 param=$(echo $list | awk "{print \$$a}")
 if [ $param ]
 then
# для того, чтобы убедиться
#       jobs
   jobs=$(jobs | wc -l)
   if (( jobs < limit))
       then
         test $param &
         (( a++ ))
# чтобы не было расхода процессора - раскомментируйте: (просто иначе на пингах не видно ;))
#         sleep 1
       fi
 else
       break
 fi
done

wait
1 nop
 
12.08.09
22:03
Да! Он убивает мой мозг!
2 Fragster
 
гуру
12.08.09
22:04
блин, комментарии не удалил :(
3 ink1981
 
12.08.09
22:05
(0) Умничаеш во первых поравь ощибки, во вторых за табой уже выехали
4 ДенисЧ
 
12.08.09
22:06
фигню какую-то делает...
Или это кусок бдбота?
5 Fragster
 
гуру
12.08.09
22:10
(4) мля, палюсь... о_О
6 hd1
 
13.08.09
05:10
uptime ?
7 smaharbA
 
13.08.09
06:51
почему не фор и нафига авк, да и к переменным можно косвенно обращаться ?
8 Fragster
 
гуру
13.08.09
08:44
(7) а ты с фором сделай ;)
9 Дуб
 
13.08.09
08:45
Мельчает народ.. Раньше "на слабо" уксус пили, с крыш прыгали..
А теперь - код какой-то...
10 Asmody
 
13.08.09
08:59
как бе...

printf "mail.ru\nya.ru\nmista.ru\ngoogle.com" > temp && nmap -sP -iL temp && rm temp
11 Asmody
 
13.08.09
09:00
(10)+ это учитывая, что nmap "из коробки" сам распараллеливается
12 smaharbA
 
13.08.09
09:12
(8) а в чем прикол ? почему фор не проканает ?
13 Fragster
 
гуру
13.08.09
09:15
(10) ты не понял, это же прототип, не только для пингов, а для архивирования, кодирования всякого говна и прочего.
(12) если ты про for a in $list - то не проканает, если со счетчиком - то проканает, но красивее не получится
14 smaharbA
 
13.08.09
09:17
(10) тогда уж
nmap -sP `echo -e "mail.ru\ngoogle.com"`
15 smaharbA
 
13.08.09
09:18
(13) почему не проканает ? поясни, лениво ведь думать ))
16 Fragster
 
гуру
13.08.09
09:19
(14) oping mail.ru google.ru тогда уж ;) только не надо жаловаться что у тебя его нету :). да и распараллеливается все это неправильно (не так, как (0))
(15) смотри в условие внутри цикла
17 smaharbA
 
13.08.09
09:20
а счетчик

a=0;while [ $((a++)) -lt 3 ]; do echo $a; done
18 Fragster
 
гуру
13.08.09
09:22
тогда уж
for ((a=1; a <= limit ; a++))
только не то это...
19 Fragster
 
гуру
13.08.09
09:26
хинт: чтобы понять, что делает этот скрипт - его можно запустить. с параметром меньшим, чем количество элементов списка.
20 smaharbA
 
13.08.09
09:58
ну запускает в параллель, зарить ограничение если надо еще гонит
все равно не понял почему именно так
вмесо авк

list="mail.ru ya.ru google.ru mista.ru";aaa()( echo ${@:$(($1+1)):1} ); aaa 1 $list
21 Fragster
 
гуру
13.08.09
10:06
(20) потому что ограничение количества одновременных процессов
22 smaharbA
 
13.08.09
10:59
(21)

cat Fragster
#!/bin/bash

list="mail.ru fignya.ya ya.ru google.ru mista.ru"

test() {
   echo start $1
   ping -c 3 $1 > /dev/null
   echo end $1
}

limit=$1

fignya() {
   a=0
   param=x
   while ! [ -z "$param" ]; do
       if [ `jobs -pr | wc -l` -le $limit ]; then
           param=${@:$((a++)):1}
           [ -z "$param" ] || test $param &
       fi
   done
   }
fignya $list
wait


кстати джобс можно выкинуть есть неплохое $!
23 Fragster
 
гуру
13.08.09
11:49
(22) line 18: [: 0: ожидается использование унарного оператора
24 smaharbA
 
13.08.09
11:53
ну просто jobs тогда, может отличаться синтаксис (это беда всех линуксов)
25 Fragster
 
гуру
13.08.09
12:01
fignya() {
   while [ $1 ]; do
       if (( `jobs  | wc -l` < limit )); then
       shift
           if [ $1 ]; then
         test $1 &
       fi
       fi
   done
   }
26 Fragster
 
гуру
13.08.09
12:02
даже

fignya() {
   while [ $1 ]; do
       if (( `jobs  | wc -l` < limit )); then
         test $1 &
         shift
       fi
   done
   }
27 Asmody
 
13.08.09
12:05
вчера на Хабре http://habrahabr.ru/blogs/linux/66903/
28 Fragster
 
гуру
13.08.09
12:08
(27) это я и есть ;)
29 Asmody
 
13.08.09
12:14
ну т.е. весь смак в том, чтобы контролировать число параллельных процессов? товарищ там элегантно сделал через make -j
30 Fragster
 
гуру
13.08.09
12:17
(29) решение автора меня не устроило необходимостью внешнего файла
31 Asmody
 
13.08.09
12:28
(30) а в чем проблема из скрипта создать временный файл, а потом удалить? :)
32 Fragster
 
гуру
13.08.09
12:30
(31) это уже онанизм какой-то получается ;)
33 smaharbA
 
13.08.09
12:36
да... про шифт то забыл я :(
34 Fragster
 
гуру
13.08.09
12:45
(33) да я тоже забыл... просто пытался понять, как работает ${@:$((a++)):1} :)