У меня есть 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").