Команда zap: знищення процесу по імені

Команда kill знищує тільки процеси, для яких вказаний іден тіфікатор Тому коли потрібно знищити конкретний фоновий процес, зазвичай доводиться спочатку запустити ps, щоб визна лити ідентифікатор процесу, а потім ввести його без помилок як аргумент для kill Але безглуздо мати одну програму, що виводить число, яке відразу ж доводиться вручну вводити в іншу програму Чому б не написати програму, скажімо, zap, щоб автоматизувати цю роботу

Одна з причин полягає в тому, що знищує процес небезпечний, і необхідно дотримуватися обережності, щоб не знищити не той процес Як захисний засіб будемо виконувати zap інтерактивно і вибирати жертви за допомогою команди pick

Короткий нагадування про pick: вона виводить всі свої аргументи з очере ді і чекає відповіді користувача якщо відповідь y, то аргумент виводиться (докладніше про цю команду буде розказано в наступному розділі) Команда zap використовує pick для того, щоб перевірити, чи є процеси, вибрані по імені, тими, які користувач хоче знищити:

$ cat  zap

# Zap pattern: знищити процеси, відповідні шаблоном

# У цій версії ПОМИЛКА PATH = / bin :/ usr / bin

case  $# in

0)    echo Usage:  zap pattern  1&gt&amp2  exit 1 esac

kill  `pick \`ps –ag | grep  &quot$*&quot\`  | awk  {print }`

$

Зверніть увагу на вкладені лапки, захищені символами зворотного косою риси Програма awk вибирає вказаний pick ідентифікатор процесу з вихідних даних команди ps:

$ sleep 1000 &amp

22126

$ ps  -ag

PID TTY  TIME  CMD

22126 0     0:00  sleep 1000

$ zap  sleep

22126

0 q                                     Що відбувається

$

Проблема полягає в тому, що виведення ps розбитий на слова, і команда pick сприймає їх як окремі аргументи замість того, щоб обробляти весь рядок цілком Оболонка звичайно розділяє рядок на аргументи, орієнтуючись на прогалини, як в

for  i in  1 2 3 4 5

У цій програмі необхідно так відрегулювати розбиття рядків на аргументи (здійснюване оболонкою), щоб сусідні «слова» розділяли тільки символи нового рядка

Мінлива оболонки IFS (internal field separator – внутрішній роздільник полів) – це рядок символів, які поділяють слова на списки аргументів, такі як зворотний апостроф або оператори for Зазвичай IFS містить пробіл, знак табуляції і символ нового рядка, але його можна і змінити, наприклад, залишивши тільки символ нового рядка:

$ echo echo  $#  &gtnargs

$ cx  nargs

$ who

you           tty0

Oct

1 05:59

pjw           tty2

Oct

1 11:26

$ nargs  `who`

10

Десять полів, розділених пробілами і

роздільниками рядків

$ IFS=

Тільки роздільник рядків

$ nargs  `who`

2

Два рядки, два поля

$

Якщо IFS включає в себе тільки роздільник рядків, то команда zap працює правильно:

$ cat  zap

# Zap pat: знищити всі процеси, відповідні pat

# Остаточна версія

PATH=/bin:/usr/bin IFS=

‘# Тільки роздільник рядків

case   in

&quot&quot)   echo Usage: zap [–2]  pattern 1&gt&amp2 exit  1 ;

–*)  SIG=  shift esac

echo  PID  TTY      TIME  CMD

kill $SIG `pick \`ps  –ag | egrep  &quot$*&quot\`  | awk  {print  }`

$ ps  -ag

PID TTY  TIME  CMD

22126 0     0:00  sleep 1000

$ zap  sleep

PID TTY  TIME  CMD

22126  0      0:00  sleep  1000  y 23104  0      0:02  egrep  sleep  n

$

У цю версію внесено ще два корисних зміни: доданий необовязковий аргумент для вказівки сигналу (зверніть увагу на те, що якщо аргумент відсутній, то SIG НЕ буде визначений і, отже, вважатиметься порожнім рядком), а замість grep використана egrep – для того, щоб можна було задавати більш складні шаблони, як, наприклад, sleep | date. Команда echo друкує заголовки колонок для виведення ps

Може здатися дивним, що команда отримала імя zap замість того, щоб називатися просто kill Основна причина полягає в тому, що (на відміну від прикладу з командою cal) це не нова версія команди kill, адже zap зобовязана бути інтерактивною До того ж нам хотілося зберегти назву kill для справжньої команди Ще одне заме чание: zap надзвичайно повільна команда – позначається наявність всіх додаткових програм, при цьому найбільше витрат припадає на команду ps (яка, так чи інакше, але повинна виконуватися) У наступному розділі буде запропонована більш продуктивна реалізація

Вправа 523Змініть zap таким чином, щоб виводити заголовок ps з конвеєра так, щоб він був не чутливий до змін формату виводу ps Наскільки це ускладнить програму

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*