Команда wait

Thank you for reading this post, don't forget to subscribe!

Wait — это коман­да shell, кото­рая ожи­да­ет завер­ше­ния опре­де­лен­но­го про­цес­са, а затем воз­вра­ща­ет его состо­я­ние завершения.

Коман­да wait исполь­зу­ет­ся для ожи­да­ния опре­де­лен­но­го иден­ти­фи­ка­то­ра про­цес­са и иден­ти­фи­ка­то­ра зада­ния и воз­вра­та их ста­ту­са завершения.

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

Как работает команда wait

Коман­да wait, исполь­зу­е­мая для наблю­де­ния за преды­ду­щим про­цес­сом, зави­сит от состо­я­ния воз­вра­та преды­ду­ще­го про­цес­са и воз­вра­ща­ет ста­тус выхода.

Напри­мер, если мы хотим дождать­ся завер­ше­ния опре­де­лен­но­го иден­ти­фи­ка­то­ра про­цес­са 13245, то мы долж­ны исполь­зо­вать «ждать 13245», когда про­цесс 13245 завер­ша­ет коман­ду ожи­да­ния, воз­вра­ща­ю­щую зна­че­ния 13245 состо­я­ния выхода.

— wait PID (PID — иден­ти­фи­ка­тор про­цес­са коман­ды, для кото­рой ути­ли­та ожи­да­ет завершения).
— wait JID (JID — иден­ти­фи­ка­тор зада­ния, кото­рый иден­ти­фи­ци­ру­ет фоно­вый про­цесс, ожи­да­ю­щий wait, при­ме­ним толь­ко для вызо­вов wait в теку­щей сре­де выпол­не­ния оболочки).

Зна­че­ние состо­я­ния выхо­да коман­ды ожи­да­ния зави­сит от послед­не­го ука­зан­но­го PIDJID.

Если какой-либо про­цесс завер­ша­ет­ся ненор­маль­но, состо­я­ние выхо­да будет боль­ше 128.

Коман­да ожи­да­ния завер­ша­ет­ся со зна­че­ни­ем 0, когда она вызы­ва­ет без дочер­не­го про­цес­са, и все иден­ти­фи­ка­то­ры про­цес­са, извест­ные теку­щей обо­лоч­ке, завершены.

Если коман­да wait обна­ру­жи­ва­ет какую-либо ошиб­ку, она воз­вра­ща­ет любое зна­че­ние от 1 до 126.

Если послед­ний иден­ти­фи­ка­тор про­цес­са неиз­ве­стен, коман­да ожи­да­ния завер­ша­ет­ся со зна­че­ни­ем 127.

Примеры команд wait

Давай­те про­ве­рим несколь­ко скрип­тов, что­бы понять, как рабо­та­ет коман­да wait.

Пример: 1 — скрипт с командой wait

У нас есть два скрип­та с име­на­ми «foo.sh» и «bar.sh».

Скрипт «Foo.sh» выво­дит чис­ла от 1 до 5, а скрипт «bar.sh» вызы­ва­ет foo.sh и запус­ка­ет его в фоно­вом режи­ме, полу­ча­ет PID для foo.sh и ожи­да­ет его завер­ше­ния, после его завер­ше­ния нач­ни­на­ет цикл ‘bar.sh’ и завершается.

Скрипт – foo.sh

Скрипт – bar.sh

Резуль­тат

Пример 2 — Скрипт без команды wait

У нас есть два скрип­та с име­на­ми «foo.sh» и «bar.sh».

Скрипт ‘foo.sh’ выво­дит чис­ла от 1 до 5, а скрипт bar.sh вызы­ва­ет foo.sh и запус­ка­ет его в фоно­вом режи­ме, но не будет ждать завер­ше­ния foo.sh и выпол­не­ния обо­их скриптов.

Скрипт – foo.sh

Скрипт – bar.sh

Резуль­тат

Пример: 3 — Скрипт с командой wait и статусом возврата

Скрипт ‘bar.sh’ вызо­вет foo.sh и запу­стит его в фоно­вом режи­ме, полу­чит PID фай­ла foo.sh и дождет­ся его завер­ше­ния, после его завер­ше­ния запу­стит­ся цикл bar.sh и завершится.

Нако­нец, он воз­вра­ща­ет код выхо­да скрип­та foo.sh

Скрипт — foo.sh (ста­тус выхо­да = 0)

Скрипт — foo.sh

Скрипт – bar.sh

Резуль­тат

Скрипт — foo.sh (ста­тус выхо­да = NON ZERO)

Скрипт — foo.sh

Скрипт– bar.sh

Резуль­тат

Заключение

Wait и Sleep — это систем­ные вызо­вы в опе­ра­ци­он­ной систе­ме, осно­ван­ные на времени.

Давай­те посмот­рим раз­ни­цу меж­ду коман­да­ми wait  и sleep.

Wait: когда поль­зо­ва­тель хочет оста­но­вить теку­щий про­цесс, он осво­бож­да­ет все ресур­сы, удер­жи­ва­е­мые про­цес­сом, и ожи­да­ет выпол­не­ния дру­го­го процесса.

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

Sleep: этот систем­ный вызов исполь­зу­ет­ся тогда, когда поль­зо­ва­тель хочет на неко­то­рое вре­мя оста­но­вить теку­щий про­цесс. Он удер­жи­ва­ет бло­ки­ров­ки ресур­сов до исте­че­ния вре­ме­ни ожи­да­ния и сно­ва запус­ка­ет выпол­не­ние про­цес­са. Здесь про­цесс име­ет кон­троль на про­тя­же­нии все­го выпол­не­ния. Напри­мер, я выпол­нил неко­то­рую коман­ду в bash и хочу неко­то­рое вре­мя ухо­дить в sleep, так как ожи­даю неко­то­ро­го выво­да от выпол­нен­ной коман­ды, кото­рая будет исполь­зо­вать­ся для даль­ней­ше­го выпол­не­ния теку­ще­го процесса.