Автор Тема: Bash shell script - многозадачност  (Прочетена 5564 пъти)

Astor

  • Напреднали
  • *****
  • Публикации: 332
    • Профил
Здравейте, ако темата случайно не е за този раздел, може да се премести.

Трябва да направя следното:
скрипт1 да следи през определено време за "специални" ESTABLISHED връзки в netstat. След като намери специална връзка да почне да се изпълняват други задачи (ping, iptables -A...) например от скрипт2/функция2. В същото време скрипт1 да продължава да проверява за "специални" връзки. При наличие на нова такава и с нея да се процедира по същия начин...да се извика копие на скрипт2/функция2, което да проверява новата "специална" връзка

при разпадане на "специална" връзка да се преустанови действието на съответния скрипт2/функция2 (да се изтрият и iptables правилата добавени от него).

Как може да стане това с изолзването на bash, по най-интелигентен начин? Проблемът ми е по-точно със многозадачността, това едновременно изпълняване на няколко операции (било то от един или няколко скрипта)

Идеите които ми идват са: скрипт1 да извиква "скрипт2 §" - във фонов режим, като преди това със sed например е прехвърлило към него няколко променливи които ще са му необходими. Скрипт2 да си следи дали специалната връзка е налична, ако се е разпаднала да си зачисти каквото е писал и да спре.
Ако се прекрати работата на скрипт1, да се прекратят всички скриптове2, които са стартирани, заедно със зачистване на редовете които са правили.

Само че по този начин ще се генерират файлове за всяка връзка която искаме да обработваме със скрипт2.

Защо трябва да правя такива гимнастики е друг въпрос, на който не мисля да отговарям. Просто искам да питам как стои върпосът със многозадачността.

Благодаря предварително!

Активен

Няма начин, да няма начин!

dejuren

  • Напреднали
  • *****
  • Публикации: 1025
  • Distribution: Ubuntu, RedHat
  • Window Manager: lxde KDE4
    • Профил
Re: Bash shell script - многозадачност
« Отговор #1 -: May 16, 2012, 06:51 »
Виж тези материали за fork в bash:

http://www.utdallas.edu/~kcooper/teaching/5375/fall08/Tutorial8/tutorial8.htm

http://stackoverflow.com/questions/1455695/forking-multi-threaded-processes-bash

Може да ти помогне и това парче код за записване на PID на стартираните дъщерни процеси ако се наложи да ги трепеш в последствие:
Код:
PROGRAM=/path/to/myprog
$PROGRAM &
PID=$!
echo $PID > /var/run/file.pid
Активен

http://webchat.freenode.net/?channels=ubuntu-bg
The quieter you become, the more you are able to hear.
Две седмици цъкане с мишката спестяват два часа четене на документацията.

Astor

  • Напреднали
  • *****
  • Публикации: 332
    • Профил
Re: Bash shell script - многозадачност
« Отговор #2 -: May 18, 2012, 10:59 »
Благодаря ти за отговора Дежурен,

и аз така си мислех че стават нещата.
Все още обаче имам неясноти. Как да направя следното:
Цитат
$PROGRAM &
PID=$!
kill $PID
при прекратяване на дъщерния процес, искам не само да ми прекрати моментално изпълнението на скрипта: PROGRAM, ами преди това да се изтрият няколко правила в iptables зададени от конкретния дъщерен процес, които само скрипт PROGRAM си ги следи и зане кои са.

Един вид като trap...при получаване на заявка за спиране към PROGRAM, да се направи едикакво си...
Активен

Няма начин, да няма начин!

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: Bash shell script - многозадачност
« Отговор #3 -: May 18, 2012, 12:40 »
Благодаря ти за отговора Дежурен,

и аз така си мислех че стават нещата.
Все още обаче имам неясноти. Как да направя следното:
Цитат
$PROGRAM &
PID=$!
kill $PID
при прекратяване на дъщерния процес, искам не само да ми прекрати моментално изпълнението на скрипта: PROGRAM, ами преди това да се изтрият няколко правила в iptables зададени от конкретния дъщерен процес, които само скрипт PROGRAM си ги следи и зане кои са.

Един вид като trap...при получаване на заявка за спиране към PROGRAM, да се направи едикакво си...
Едно възможно решение е да препишете дъщерния процес така че да приема като параметър примерно start, stop и той да се грижи за премахването на правилата. Защото както казахте само той знае за какво иде реч. Друг вариант е в дадена директория дъщерния процес да описва какво е пускал и родителския при команда за спиране да спира процеса и да обработва това, което дъщерния е свършил
Активен

0x2B|~0x2B

Naka

  • Напреднали
  • *****
  • Публикации: 3402
    • Профил
Re: Bash shell script - многозадачност
« Отговор #4 -: May 18, 2012, 13:44 »
Добре де, убиването на процеси по PID, не е ли опасно?
номерата на процесите в една система се сменят непрекъснато едни се стартират, други се спират.
Какво би станало ако междувременно въпросният PID умре, (поради някава причина) и системата или някой друг стартира някой друг процес, който случайно получи същият PID номер?

Тогава въпросният скрипт може да утрепе друг процес?

Не знам как точно стоят нещата само съм се замислял за такава ситуция. И дали спирането по PID е правилна тактика? Има ли и друг по сигурен начин?



Активен

Perl - the only language that looks the same before and after encryption.

dejuren

  • Напреднали
  • *****
  • Публикации: 1025
  • Distribution: Ubuntu, RedHat
  • Window Manager: lxde KDE4
    • Профил
Re: Bash shell script - многозадачност
« Отговор #5 -: May 18, 2012, 23:33 »
@ Naka лимита за номера на процеси е 32768 (по-точно стойността в $(cat /proc/sys/kernel/pid_max), 32768 е на машината от която ти пиша в момента), т.е. PID може да е между 1 и 32768. Всеки нов процес стартира с номер +1. Може и да е възможно, но аз не мога да си представя машина която стартира и спира толкова процеси, че в разумен интервал от време да превърти пълен цикъл PID и да стигне до началния номер, който да се присвои на нов процес и нашия скрипт да го убие по погрешка. Обикновено минават дни и повече преди да видим старите номера PID. Ако скрипт продължава да работи толкова време най-добре ще е да се отървем от него и да говорим за преписването му като  демон на С.

@Astor Като прегледах пак какво се опитваш да постигнеш ми се струва по-подходящо да вкараш всичко в един скрипт, като отделните други задачи след намерена специална връзка да се разбият по функции. Същия скрипт да бъде изпълняван от cron, като предполагам интервалът за проверките не е по 100 пъти в минута? Няма пречки да работи и при такава честота, но вероятно може да се намери по-елегантно решение в този случай. Както виждам и romeo_ninov клони към обединяването на повече функции в един скрипт.
Активен

http://webchat.freenode.net/?channels=ubuntu-bg
The quieter you become, the more you are able to hear.
Две седмици цъкане с мишката спестяват два часа четене на документацията.

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: Bash shell script - многозадачност
« Отговор #6 -: May 18, 2012, 23:49 »
@ Naka лимита за номера на процеси е 32768 (по-точно стойността в $(cat /proc/sys/kernel/pid_max), 32768 е на машината от която ти пиша в момента), т.е. PID може да е между 1 и 32768. Всеки нов процес стартира с номер +1. .....
Не знам за коя ОС иде реч, но по мои спомени ПИД-а се генерира случайно число, а не е следващото. Имаше преди време дискусия точно по въпроса за възможна атака, базирана на последователните ПИД-ове. А броя на процесите не трябва ли да е 64к (при Линукс) докато при други ОС е (мисля) 16м
Активен

0x2B|~0x2B

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Bash shell script - многозадачност
« Отговор #7 -: May 19, 2012, 00:42 »
PID-а е 32-битов, но максималната стойност е 32768, защото в ядрото, pid-а на новосъздадения task се and-ва с такава маска. Освен което не са никак случайни, а при създаване на нов task (това включва или форк-ване на процеса, или създаване на нова нишка) новият pid е последния + 1. Атаки биха били възможни, ако примерно се създават временни файлове в world-writable директория и името им е производно на pid-а (и няма други източници на ентропия). Обаче при положение че pid-овете са максимум 32768, така или иначе няма голямо значение дали новия pid е случаен или не. В смисъл да, възможно е, но не - това не е проблем на операционната система, а на приложението.

Активен

"Knowledge is power" - France is Bacon

solarflux

  • Напреднали
  • *****
  • Публикации: 100
    • Профил
Re: Bash shell script - многозадачност
« Отговор #8 -: May 19, 2012, 00:52 »
PID-а е 32-битов, но максималната стойност е 32768
На 64бит PID_MAX_LIMIT е 4194304, за 32бит е 32768
Активен

SmashThePain

  • Напреднали
  • *****
  • Публикации: 21
    • Профил
Re: Bash shell script - многозадачност
« Отговор #9 -: May 29, 2012, 16:49 »
С два отделни скрипта подръжката ще е трудна работа. Да не говорим за шейрването на данни. Bash позволява да се детачваш от функции. Тоест може да имаш нещо от сорта:

Код:
#!/bin/bash

shared='Shared data'

dfunc () {
    echo 'Proceed..'
    echo $shared
}     

while true; do
    echo 'Cecking'
    dfunc &       
    sleep 1
done

В този случай подръжката и споделянето на данни е чувствително по-лесно. В bash 4 има асоциативни масиви (хеш таблици). С хеш таблица ще може да знаеш по всяко време кой процес за коя връзка какво прави. Съответно при спирането на връзка, ще можеш лесно да определиш какво трябва да ристорнеш.

Аз лично не бих се занимавал да правя това нещо. По-скоро бих определил дифолни стойности ако може разбира се и след прекъсването на връзка ще връщам към дифолтни стойности.
Успех!
Активен

Astor

  • Напреднали
  • *****
  • Публикации: 332
    • Профил
Re: Bash shell script - многозадачност
« Отговор #10 -: May 29, 2012, 22:33 »
Благодаря ви за отговорите на всички! Аз първоначално го направих с два скрипта, но вариантът с функции стартирани във фонов режим е по-добър и по-лесен. По същия начин се процедира после със спирането на стартиран подпроцес (функция), както при скрипт:

Цитат
function &
PID=$!
kill $PID
Активен

Няма начин, да няма начин!

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
rc.d shell script
Настройка на програми
VlasA 3 2853 Последна публикация Aug 29, 2004, 12:05
от VlasA
Bash shell
Настройка на програми
Elmondo 13 4584 Последна публикация Feb 08, 2006, 23:03
от Elmondo
Shell-script- за минаване от един юзър в друг
Настройка на програми
Nik123 5 3570 Последна публикация Jul 03, 2006, 20:22
от Nik123
shell script с параметри
Общ форум
k0tka 1 2882 Последна публикация May 25, 2012, 20:23
от k0tka
shell script
Общ форум
villimon 29 10600 Последна публикация Nov 01, 2013, 21:43
от neter