Помогите разобраться со FreeBSD – root не может снять процесс ни по kill, ни по ctrl+C.
Система свежая, FreeBSD 7.0, на персоналке с одноядерным процессором. Единственное отличие от установки по умолчанию – терминалы стали русские (cons25r, но сообщения об ошибках английские), и есть установленные Demos Commander (deco) из дистрибутива deco38.tgz и Midnight Commander, но они даже в автозапуске не прописаны.
Вот ссылка на deco38.tgz:
http://rapidshare.de/files/48014947/DECO38.TGZ.html
http://www.rapidshare.ru/1121771
Терминал 1.
login: root
password: (пустой)
#deco
Esc, esc.
“Do you want to quit the Demos Commander ?”
Yes No Exec shell
Выбираю exec shell
Видимо по умолчанию стоит шелл csh, а deco запускает sh.
#ps
PID TT STAT TIME COMMAND 745 v0 Is 0:00.05 login [pam] (login) 753 v0 I 0:00.04 -csh (csh) 757 v0 S 0:00.03 sh -i 774 v0 R+ 0:00.00 ps 746 v1 Is+ 0:00.01 /usr/libexec/getty Pc ttyv1 747 v2 Is+ 0:00.01 /usr/libexec/getty Pc ttyv2 748 v3 Is+ 0:00.01 /usr/libexec/getty Pc ttyv3 749 v4 Is+ 0:00.01 /usr/libexec/getty Pc ttyv4 750 v5 Is+ 0:00.01 /usr/libexec/getty Pc ttyv5 751 v6 Is+ 0:00.01 /usr/libexec/getty Pc ttyv6 752 v7 Is+ 0:00.01 /usr/libexec/getty Pc ttyv7
#pwd
/root
#mkfifo fif
Далее пример из книжки Робачевского «Операционная система Unix» (2-е издание) с. 25.
#while : ; do date >fif; sleep 5; done&
#ps
PID TT STAT TIME COMMAND 745 v0 Is 0:00.05 login [pam] (login) 753 v0 I 0:00.04 -csh (csh) 757 v0 S 0:00.03 sh -i 779 v0 I 0:00.00 sh -i 780 v0 I 0:00.00 sh -i 782 v0 R+ 0:00.00 ps 746 v1 Is+ 0:00.01 /usr/libexec/getty Pc ttyv1 747 v2 Is+ 0:00.01 /usr/libexec/getty Pc ttyv2 748 v3 Is+ 0:00.01 /usr/libexec/getty Pc ttyv3 749 v4 Is+ 0:00.01 /usr/libexec/getty Pc ttyv4 750 v5 Is+ 0:00.01 /usr/libexec/getty Pc ttyv5 751 v6 Is+ 0:00.01 /usr/libexec/getty Pc ttyv6 752 v7 Is+ 0:00.01 /usr/libexec/getty Pc ttyv7
Это уже странно. Когда тот же пример запускался, не выходя из deco (просто у него в командной строке набирал), 2 создаваемых процесса назывались не sh -i, а по той командной строке (while и пр.), что я набирал. В csh же, что по умолчанию во FreeBSD, вообще при интерпретации строки вылезает ошибка и пример Робачевского в этом шелле попросту не работает.
Продолжаем пример Робачевского
#while : ; do awk ‘{print $4}’ fif; done
Он начинает с интервалом в 5 секунд выводить текущее время.
У Робачевского – «для остановки используйте ^C». Так вот, оно не работает. Появляется ^C на экране, а цифры все идут. Причем, когда все запускалось из-под deco, ^C работало.
Терминал 2.
login: root
password: (пустой)
#ps
PID TT STAT TIME COMMAND
745 v0 Is 0:00.05 login [pam] (login)
753 v0 I 0:00.04 -csh (csh)
757 v0 S 0:00.07 sh -i
779 v0 S 0:00.05 sh -i
948 v0 S 0:00.00 sleep 5
949 v0 S+ 0:00.00 awk {print $4} fif
746 v1 Is 0:00.04 login [pam] (login)
923 v1 S 0:00.05 -csh (csh)
946 v1 R+ 0:00.00 ps
747 v2 Is+ 0:00.01 /usr/libexec/getty Pc ttyv2
748 v3 Is+ 0:00.01 /usr/libexec/getty Pc ttyv3
749 v4 Is+ 0:00.01 /usr/libexec/getty Pc ttyv4
750 v5 Is+ 0:00.01 /usr/libexec/getty Pc ttyv5
751 v6 Is+ 0:00.01 /usr/libexec/getty Pc ttyv6
752 v7 Is+ 0:00.01 /usr/libexec/getty Pc ttyv7У процессов sleep, awk номера все время меняются (что неудивительно).
Пытаемся снять тот процесс, у которого номер не меняется.
#kill 779
Нет ответного сообщения. Даем ps и видим, что... процесс жив!
#ps
PID TT STAT TIME COMMAND
745 v0 Is 0:00.05 login [pam] (login)
753 v0 I 0:00.04 -csh (csh)
757 v0 S 0:00.08 sh -i
779 v0 S 0:00.07 sh -i
1013 v0 S 0:00.00 sleep 5
1014 v0 S+ 0:00.00 awk {print $4} fif
746 v1 Is 0:00.04 login [pam] (login)
923 v1 S 0:00.06 -csh (csh)
1015 v1 R+ 0:00.00 ps
747 v2 Is+ 0:00.01 /usr/libexec/getty Pc ttyv2
748 v3 Is+ 0:00.01 /usr/libexec/getty Pc ttyv3
749 v4 Is+ 0:00.01 /usr/libexec/getty Pc ttyv4
750 v5 Is+ 0:00.01 /usr/libexec/getty Pc ttyv5
751 v6 Is+ 0:00.01 /usr/libexec/getty Pc ttyv6
752 v7 Is+ 0:00.01 /usr/libexec/getty Pc ttyv7Такой же эффект на команду
#kill 757
Помогает только
#shutdown -r now
Если вместо запуска deco набрать просто #sh -i, таких проблем не возникает – процесс, осуществляющий цикл (и его потомки), снимается по первому же ^C.
Что не так?
kill -9 757
Таже херня и у меня. Когда в фоновом режиме запускается какая-то команда, которая выполняется в консоли (у тебя вывод в пайп) то в процессах весит баш. Видимо так и надо.
А почему есть отличие между происходящим после работы в deco и после простого ручного запуска sh -i ? В чем тут отличие ?
$man bash
-i If the -i option is present, the shell is interactive.
http://www.faqs.org/docs/bashman/bashref_67.html
6.3.3 Interactive Shell Behavior
Job Control (see section 7. Job Control) is enabled by default. When job control is in effect, Bash ignores the keyboard-generated job control signals SIGTTIN, SIGTTOU, and SIGTSTP.
Эээ...видимо после этого коммандера ты еще находишься в sh -i. Попробуй suspend или exit. Че там получилось?
In the absence of any traps, Bash ignores SIGTERM (see section 3.7.6 Signals).
>$man bash
>-i If the -i option is present, the shell is interactive.
Видишь ли если посмотреть невооруженным глазом, то -i присутствует в обоих случаях (я ведь когда руками ее пускал, а не после Demos, тоже набирал bash -i, и после демоса висело bash -i)
PS: вообще-то какой bash? Там был sh
Тема в архиве.