Как узнать из скрипта bash, что пользователь внезапно закрывает сессию ssh - PullRequest
1 голос
/ 13 мая 2010

У меня есть bash-скрипт, который действует как оболочка по умолчанию для пользователя, входящего в систему через ssh. Он предоставляет меню с несколькими опциями, одна из которых отправляет файл с помощью netcat.

Netcat встроенного Linux, который я использую, не имеет опции -w, поэтому, если пользователь закрывает соединение ssh, даже не отправляя файл, команда netcat ждет вечно.

Мне нужно знать, внезапно ли пользователь закрывает соединение, чтобы скрипт мог убить команду netcat и завершить работу корректно.

То, что я пробовал до сих пор:

  • Отлов SIGHUP: не выдается. Единственный сигнал, который я смог найти, это SIGCONT, но я не думаю, что он надежный и портативный.
  • Воспроизведение с опцией -t команды чтения для обнаружения закрытого стандартного ввода: это будет работать, если бы не глупая ошибка во встроенной команде чтения (только время ожидания при первом вызове)

Edit:

Я постараюсь ответить на вопросы в комментариях и объяснить ситуацию дальше.

Код, который у меня есть:

nc -l -p 7576 > /dev/null 2>> $LOGFILE < $TMP_DIR/$BACKUP_FILE &
wait

Я игнорирую SIGINT и SIGTSTP, но я попытался перехватить все сигналы, и единственный полученный - SIGCONT.

Читая справочную страницу bash, я обнаружил, что SIGHUP следует отправлять как сценарию, так и netcat, и что SIGCONT отправляется остановленным заданиям, чтобы гарантировать получение SIGHUP.

Я полагаю, что ожидание заставляет скрипт считаться остановленным, и поэтому он получает SIGCONT, но в то же время ожидание как-то пожирает SIGHUP.

Итак, я попытался изменить ожидание сна, а затем были получены и SIGHUP, и SIGCONT.

Вопрос: почему ожидание блокирует SIGHUP?


Редактировать 2: Решено

Я решил опрашивать закрытый stdin с помощью встроенного read, используя опцию -t. Чтобы обойти ошибку в встроенной функции чтения, я породил ее в новом bash (bash -c "read -t 3 dummy").

Ответы [ 2 ]

0 голосов
/ 14 июля 2010

Я написал похожие приложения. Было бы полезно иметь больше кода в вашей оболочке. Я думаю, что может быть способ написать вашу общую программу по-другому, чтобы решить эту проблему.

0 голосов
/ 13 мая 2010

Меняется ли родительский PiD? Если это так, вы можете найти родительский элемент в списке процессов и убедиться, что имя процесса указано правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...