LINUX.ORG.RU

Почему при наличии фоновых процессов, при переподключении к серверу кидает на новый TTY? Без активных процессов стабильное подключение к одному и тому же.

 , ,


1

0

Доброго времени суток! Переформулировал вопрос, ибо было много текста: Делаю лаб. работу по Юниксу - «управление процессами»

Запускаю скрипт: while((++i)); do echo $i » file.txt; sleep 1; done командой pr1 & перевожу процесс в фоновый режим

ps -l показывает данный процесс с TTY pts/5: F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 1 S 11007 16359 16320 0 80 0 - 1735 - pts/5 00:00:00 bash

Далее перезахожу в систему, (по-идее процесс должен умереть, так же?), ввожу опять ps -l вижу, что процесса 16359 нет, а я подключен уже с pts/7 (ну или с любого другого). ps -u username - таким образом пропавший процесс находится, запущенный и работающий от старого pts/5 TTY.

Если я не запускаю фоновых процессов, а просто подряд перезахожу в систему (ctrl+D, а также exit или logout, подключение по ssh через putty), подключаюсь все время к одному TTY. Собственно, вопрос: По заданию я должен «перезайти в систему», посмотреть что этим я убил свой фоновый процесс, а потом сделать для него защиту от прерываний (при выходе из системы). Почему процесс не умирает, я же не задаю nohup? Почему меня кидает на новый TTY? Что делаю не так?)



Последнее исправление: RainJa (всего исправлений: 10)
Ответ на: Спасибо за оперативность! от RainJa

Начнём с того, что у тебя маленькя ошибка в самом скрипте. Надо было бы ещё добавть shebang в начало, иначе оно запускается не bash'ем, а sh, а он про конструкцию ((++i)) ничего не знает.

#!/bin/bash

while ((++i)); do
        echo $i
        sleep 1
done

Можешь и сам проверить: запусти sh script.sh и bash script.sh

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

Не во всех. И даже в единственном живом юниксе нет:

➜  ~  which sh
/bin/sh
➜  ~  which bash
/bin/bash
➜  ~  uname -a
Darwin mba13.local 14.3.0 Darwin Kernel Version 14.3.0: Mon Mar 23 11:59:05 PDT 2015; root:xnu-2782.20.48~5/RELEASE_X86_64 x86_64

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

Разница есть, просто она не всегда заметна. man bash:

If  bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.

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

Тем не менее, поведение зависит от __progname. ж)

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

ctrl+D

а также exit, logout. Подключение по ssh через putty

RainJa
() автор топика

У вас странная формулировка:

я должен «перезайти в систему», посмотреть что этим я убил свой фоновый процесс

Убивает не перезаход, а просто отключение, не важно, был ли после отключения вход в систему или нет.

Пока я не знаю деталей механизма, но, в общем у меня получается так, что если выходить из bash'а через logout или ^D (штатное завершение работы), то фоновые процессы остаются и терминал не отправляет им SIGHUP. А вот если «убивать» эмулятор терминала (kill xterm) — как бы обрыв связи, то фоновые процессы получают SIGHUP.

А по ″logout″ может быть отправка ″SIGHUP″ от bash'а, если у bash установлена опция ″huponexit″. Так что для проведения лабы можете делайть в bash'е ″shopt″.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.