Используя Putty на моей машине Vista, я вошел на свой сервер разработки (Ubuntu) и запустил тестовый сервер Django. Он запускает сервер типа Apache для тестирования моего веб-приложения. Приложение работает на моем внутреннем IP-адресе, на порту 8080. Я могу открыть его через веб-браузер и перейти к 192.168.0.130:8080
.
Я оставил свой компьютер на некоторое время (физически) и вернулся, чтобы обнаружить, что соединение Putty истекло. Ничего страшного, я просто снова вошел на сервер. Однако, когда я пытаюсь запустить тестовый сервер Django, он говорит, что порт уже используется. Это означает (я думаю), что первый экземпляр тестового сервера все еще работает на порту 8080.
Как мне убить этот процесс? Как вообще выглядит этот процесс? Я сделал ps aux
и у меня такое чувство, что это и есть этот процесс-нарушитель:
garfonzo 5719 0.3 0.0 0 0 ? D 08:58 1:07 [python]
Так как я запустил сервер сегодня утром примерно в это время, а Django основан на Python. Однако выполнение a kill 5719
ничего не дает — процесс не убивается, и я все еще не могу запустить тестовый сервер.
Есть идеи!?
РЕДАКТИРОВАТЬ-- Больше подробностей:
Я тоже запустил netstat -tulpn
и вот что вывело:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.1.130:8080 0.0.0.0:* LISTEN -
Разве это не удобно? Тот порт, идентификатор процесса которого мне нужен, не имеет PID!
решение1
Если вы уверены, что это правильный процесс (что кажется вероятным), и поскольку netstat не сообщает вам ничего полезного, то вы можете использовать
kill -9 5719
Переключатель -9 отправляет сигнал SIGKILL вместо сигнала по умолчанию SIGTERM, который останавливает процесс, если его можно остановить.
Сигнал SIGTERM отправляется процессу и фактически просит его завершить работу. Процесс может выбрать перехват SIGTERM и сделать что-то совершенно другое.
Сигнал SIGKILL, с другой стороны, не передается процессу, и поэтому не может быть проигнорирован. Ядро немедленно завершает процесс, поэтому его следует использовать только в качестве крайней меры, поскольку он не дает процессу возможности очиститься.
Если процесс заблокирован вводом-выводом, то его, возможно, не удастся остановить с помощью SIGKILL. В этом случае это зомби-процесс, и для его очистки может потребоваться перезагрузка.
Уточнение: процесс не может быть завершен, если он ожидает ввода-вывода, поскольку это приведет к появлению неактивного обратного вызова для функции ядра, которая выполняет указанный ввод-вывод.
Или, если родитель процесса не вызывает wait
, процесс останется как процесс-зомби. Хороший обзор мертвых процессов находится по адресуhttp://www.linuxsa.org.au/tips/zombies.html.
Что это за зомби-процессы, которые появляются в ps? Я их убиваю, но они не исчезают!
Зомби — это мертвые процессы. Вы не можете убить мертвых. Все процессы в конечном итоге умирают, и когда это происходит, они становятся зомби. Они почти не потребляют ресурсов, что и следовало ожидать, поскольку они мертвы! Причина существования зомби в том, что родитель зомби (процесс) может получить статус выхода зомби и статистику использования ресурсов. Родитель сигнализирует операционной системе, что зомби ему больше не нужен, используя один из системных вызовов wait().
Когда процесс умирает, все его дочерние процессы становятся дочерними процессами процесса номер 1, который является процессом init. Init ``всегда'' ждет, когда дочерние процессы умрут, чтобы они не остались зомби.
Если у вас есть зомби-процессы, это значит, что эти зомби не были подожданы их родителем (посмотрите на PPID, отображаемый ps -l). У вас есть три варианта: исправить родительский процесс (заставить его ждать); убить родителя; или жить с этим. Помните, что жить с этим не так уж и сложно, потому что зомби занимают чуть больше одной дополнительной строки в выводе ps.