LINUX.ORG.RU

Не убивается gdb из сценария bash (Линукс).

 


0

1

Многое перепробовал:

#!/bin/sh
gdb -pid "$(pidof plasmashell)" -batch -ex "set logging file /home/viktor/plasmashell2-19.txt" -ex "set logging on"  [ -ex "continue"] -ex "thread apply all backtrace" -ex "sleep 3" -ex  "set logging off" -ex "detach $(pidof plasmashell)" -ex "quit" -ex "exit" -ex "monitor exit"
kill -INT "$(pidof gdb)"
kill -STOP "$(pidof gdb)"
kill "$(pidof gdb)"
kill -SIGKILL "$(pidof gdb)"
#kill -SIGKILL 74756
echo пароль | sudo -S kill -SIGKILL "$(pidof gdb)"
exit

Не убивается именно присоединённый gdb (что и надо) причём даже не прекращает писать ни в файл ни в консоль.


Ты хочешь убить gdb из ого же скрипта, из которого его вызываешь?

В скриптах команды выполняются последовательно. Прежде, чем выполнится kill, должен завершиться gdb.

gdb -pid «$(pidof plasmashell)» … [ -ex «continue»]

gdb, после присоединения к процессу, возобновляет (-ex "continue" процесс и ждёт пока тот не упадёт, либо gdb не получит сигнал -INT.

То есть все следующие за gdb команды ждут его завершения и не выполняются, пока не будут удовлетворены вышеописанные условия.

anonymous
()
Ответ на: комментарий от blex

Если после команды добавить &, то следующая команда будет выполняться одновременно с той, после которой стоит &. Амперсанд может может стоять после нескольких соседних команд, в таком случае все они будут выполняться параллельно. Например:

$ time ( sleep 1  &  sleep 1  &  sleep 1 )
( sleep 1 & sleep 1 & sleep 1; )  0.00s user 0.00s system 0% cpu 1.002 total

$ time ( sleep 1  ;  sleep 1  ;  sleep 1 ) 
( sleep 1; sleep 1; sleep 1; )  0.00s user 0.00s system 0% cpu 3.005 total

В первом случае команды выполняются параллельно, общее время на выполнение трёх sleep 1 - 1 секунда. Во втором случае команды выполняются последовательно, общее время на выполнение трёх sleep 1 - 3 секунды.

Если ты после команды gdb ... поставишь & и затем сразу команду kill, отправляющую gdb сигнал завершения, то это будет практически то же самое, что ты совсем не запустишь gdb.

Чего ты хочешь добиться этим скриптом? Отловить падение плазмы в течение трёх секунд после старта gdb? Попробуй так:

#!/bin/sh

gdb -pid "$(pidof plasmashell)" -ex "set logging file /home/viktor/plasmashell2-19.txt" -ex "set logging enabled on" -ex "continue" -ex "thread apply all backtrace" &

{ 
   sleep 3
   kill "$(pidof gdb)"
}

В этом варианте gdb и блок внутри {} будут выполняться параллельно. kill же выполнится только после того, как отработает sleep.

anonymous
()