Ха-ха, спасибо:)(Невероятная догадка из комментария к ответу ниже)
На всякий случай. :То, как вы форматируете команду в примере, предполагает, что вы пытались добавить -m 5
между -X
иPOST
(-X -m 5 POST
). Это должно быть -X POST
, потому что POST
является аргументом для -X
. Вы пробовали curl -s -m 5 -X POST http://site.com -d "data:data"
?
Один из способов сделать это — запустить приложение из сценария, а не напрямую. Приложение запускается, и его выходные данные направляются во временный файл. Затем хвост запускается против этого файла, направляемого в 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
Я считаю, что самый простой способ — запустить программу через скрипт и установить 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