LINUX.ORG.RU

thttpd не реагирует на Ctrl_C из баш-скрипта

 


0

1

Подскажите, из-за чего такое может быть? Если вызываю это из командной строки, то по Ctrl_C он благополучно завершается

thttpd -D -p 8888
(-D означает не форкать, -p - порт)

Помещаю эту строку в файл, запускаю, жму Ctrl_C - на экране появляется ^C и перенос строки. И так до бесконечности

★★★★★

Последнее исправление: makoven (всего исправлений: 2)

Non-builtin commands run by bash have signal handlers set to the values inherited by the shell from its parent. When job control is not in effect, asynchronous commands ignore SIGINT and SIGQUIT in addition to these inherited handlers. Commands run as a result of command substi‐ tution ignore the keyboard-generated job control signals SIGTTIN, SIGTTOU, and SIGTSTP.

emulek
()

Dsrkhttpd при тех же условиях нормально закрывается. Но в нем нет cgi :(

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

не, ну почему?

If bash is waiting for a command to complete and receives a signal for which a trap has been set, the trap will not be executed until the command completes. When bash is waiting for an asynchronous command via the wait builtin, the reception of a signal for which a trap has been set will cause the wait builtin to return immediately with an exit status greater than 128, immediately after which the trap is executed.

т.е. как я понимаю, тебе нужно

1. поставить ловушку на SIGINT

2. запустить команду асинхронно, с & на конце

3. СРАЗУ ПОСЛЕ этого сохранить PID задачи, который лежит в «$!» (не работает в интерактивном режиме, точнее работает по другому)

4. ждать сигнала командой wait

5. при срабатывании ловушки SIGINT убить задачу, послав ей этот SIGINT командой kill.

Ну как-то так.

emulek
()
Ответ на: комментарий от makoven

Dsrkhttpd при тех же условиях нормально закрывается.

почитай ман к thttpd, какой там требуется сигнал? Его и посылай.

emulek
()
Ответ на: комментарий от makoven

да ты хитрец!

не, я просто так делал как-то. Но давно было, я точно не помню. Надеюсь идею ты понял.

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

Работает. После Ctrl_C, pgrep thttpd наконец-то показывает пустоту

 #env !/bin/bash
 
 PORT=8888
 
 trap "killall thttpd" INT
 thttpd -D -p $PORT &
 HTTPID=$!
 echo "Server started at port $PORT with PID=$HTTPID"
 wait $HTTPID
 echo
makoven ★★★★★
() автор топика
Ответ на: комментарий от Black_Shadow

Намного лучше, ибо скрипт может быть запущено несколько экземпляров скрипта.

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

Костыли-костылёчки

#env !/bin/bash

PORT=8888

stop_thttpd(){
  kill $HTTPID
  ERRCODE=$?
  if [ $ERRCODE -eq 0 ]; then
    printf " Thttpd stopped\n"
  else
    printf "\nERROR\n"
  fi
}

trap stop_thttpd INT
thttpd -D -p $PORT &
HTTPID=$!
printf "Server started at port $PORT with PID=$HTTPID\n"
wait $HTTPID
makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.