LINUX.ORG.RU

как правильно убить один процесс после завершения другого?

 ,


0

1

есть такой код, назовем его ~/monitor:

  • запускаю исследуемую команду
  • запускаю top, который исследует исследуемую команду
  • и хочу убить top после завершения исследуемой команды
#! /bin/bash
set -m # для fg

# есть 3 (или более) параметра
interval=$1 # 1
outfile="$2" # 2
shift
shift
# 3,4,5 - $@ - исследуемая команда

rm -f "$outfile" # очищаем лог

"$@" >> "$outfile" & # запускаем исследуемую команду в фоне

top -b -d $interval -p $! >> "$outfile" & # начинаем её исследовать
top_pid=$!

fg 1 > /dev/null # ждём завершения первой команды
sleep $interval # еще немного ждём

kill $top_pid # убиваем исследователя

когда я запускаю ~/monitor 5 sleep.log sleep 20 - всё ОК

Но когда я запускаю то же в фоне ~/monitor 5 sleep.log sleep 20 & - после завершения команды завершается оболочка из которой запущен этот monitor (если запускать из под screen - screen завершается, если напрямую через ssh - закрывается соединение) Это можно как-то исправить?


видимо kill не того убивает, не знаю почему

и избавляйся от баша, шебанг должен быть #!/bin/sh

firkax ★★★★★
()

Может top завершается ещё до kill? Я бы попробовал убивать не процесс, а фоновую задачу:

kill %2
xaizek ★★★★★
()
Ответ на: комментарий от xaizek

kill убивает точно того - проверил через ps и jobs -l до kill и после.

Перепробовал и kill $top_pid и kill %2 - результат одинаковый.

Получается так

$ ~/monitor 5 sleep.log sleep 12 &
[1] 126531
$
$
$ ps -u myUser :
   PID TTY          TIME CMD
126387 ?        00:00:00 sshd
126388 pts/3    00:00:00 bash
126424 pts/3    00:00:00 monitor
126427 pts/3    00:00:00 top
126434 pts/3    00:00:00 ps
jobs -l :
[2]+ 126427 Running                 top -b -d $interval -p $! >> "$outfile" &

kill 126427

ps -u myUser :
   PID TTY          TIME CMD
126387 ?        00:00:00 sshd
126388 pts/3    00:00:00 bash
126424 pts/3    00:00:00 monitor
126435 pts/3    00:00:00 ps
jobs -l :
[2]+ 126427 Exit 143                top -b -d $interval -p $! >> "$outfile"
logout
Connection to xxx closed.

может как-то Exit 143 top влияет? Хотя для kill 126427 exit_code==0

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

а как в python вызвать fg или его аналог?

upd: а, можно попробовать сделать чтобы после завершения команды был послан сигнал в питон, а питон при получении этого сигнала убил top, и завершился

upd2: но вообще, если бы я тут какие-то списки обрабатывал, то конечно да, питон, а так - просто вызываю процессы, настраиваю перенаправления… bash с этим должен хорошо справляться…

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

Я пропустил, что сам скрипт тоже в фоне запускается. Если так работает:

setsid ~/monitor 5 sleep.log sleep 20 &

То это что-то связанное с терминальной сессией.

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

А в чём проблема? fg это не башевское изобретение

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

расставь sleep до килла и после, посмотри в какой момент проблема случается

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

«Дурной тон» это просто набор слов, наверняка красиво звучащий для гуманитариев.
Есть описание для технических специалистов?

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