Как автоматически закрыть процесс, оставленный некорректно работающим приложением после его выхода?

Ха-ха, спасибо:)(Невероятная догадка из комментария к ответу ниже)

На всякий случай. :То, как вы форматируете команду в примере, предполагает, что вы пытались добавить -m 5между -XиPOST(-X -m 5 POST). Это должно быть -X POST, потому что POSTявляется аргументом для -X. Вы пробовали curl -s -m 5 -X POST http://site.com -d "data:data"?

0
29.01.2021, 00:58
2 ответа

Один из способов сделать это — запустить приложение из сценария, а не напрямую. Приложение запускается, и его выходные данные направляются во временный файл. Затем хвост запускается против этого файла, направляемого в fifo. Следующий grep работает с fifo. Когда определенный текст найден, хвостовой процесс уничтожается, fifo закрывается, процесс приложения принудительно завершается, а временный файл удаляется.

Текст должен быть выбран таким образом, чтобы это был последний текст, выводимый приложением при выходе (, который вы можете увидеть, если запустите приложение из командной строки ). Например, последний текст, который FoxitReader выводит, когда я его закрываю, это «CJS _Module ::ExitEnumJSPlugThread».

Следующий пример сценария показывает, как это работает с FoxitReader и может быть легко адаптирован для других приложений:

#!/bin/bash
file=/tmp/foxit.txt
YOURPATH/foxitsoftware/foxitreader/FoxitReader "$@" &> $file &
foxitpid=$!
fifo=/tmp/tmpfifo.$$
mkfifo $fifo || exit 1
tail -f $file >$fifo &
tailpid=$!
grep -m 1 "CJS_Module::ExitEnumJSPlugThread" $fifo
kill $tailpid
rm $fifo
kill -9 $foxitpid
rm -f $file
exit 0
0
18.03.2021, 22:33

Я считаю, что самый простой способ — запустить программу через скрипт и установить trapна killвсю группу процессов:

#!/bin/bash
trap "kill -9 -- -$$" ERR EXIT
/path/to/gui-programm

Как это работает?

trap— это встроенная оболочка, которая выполняет определенную команду, если скрипт получает один (или несколько сигналов ). В этом случае EXIT означает изящный выход (, то есть закрытие программы GUI )и ERR для любой ошибки (, например. CTRL+C , или если foxit был убит по другой причине ). Ссылки:man signalиman bash

Используется команда kill, где -9отправляет сигнал SIGKILL. killможет завершить один процесс через kill <pid>будет воздействовать на всю группу процессов (, то есть процесс и все его дочерние элементы и ответвления ), добавляя минус к PID. --необходим для того, чтобы следующий аргумент не интерпретировался как флаг. т.е. kill -9 -- -$pidуничтожит группу процессов while.

$$— это просто PID текущего сценария оболочки. Программа GUI -является дочерним элементом сценария, а также дочерние процессы самой программы GUI -являются частью группы процессов, связанной со сценарием в качестве источника.

Если вы хотите проверить это, я предлагаю использовать много снов:

 #!/bin/bash
 #test script for kill via trap
 trap "kill -9 -- -$$" ERR EXIT
 for (( i=1 ; i<=100 ; i++ )) ; do
   sleep 120
 done
 /path/to/gui-command

Теперь, если вы выйдете из команды GUI, все спящие режимы исчезнут. Если вы закомментируете ловушку, они останутся.


Чтобы гарантировать, что trapтакже выполняется при сбоях дочерних процессов,он должен быть унаследован через set -E.

#!/bin/bash
set -E
trap "kill -9 -- -$$" ERR EXIT
/path/to/gui-programm
0
18.03.2021, 22:33

Теги

Похожие вопросы