Как освободить порты, удерживаемые сервером ноутбуков после его остановки?

Я запускаю сервер ноутбуков jupyter на экземпляре AWS (сервер Redhat Linux) для подключения через https. В файле конфигурации я указал, что это должен быть порт 9999. Однако, когда я останавливаю и перезапускаю процесс с помощью Ctrl-C, порт не освобождается, как показано ниже.

[user@ip-xxx-xx-xx-xxx notebook]$ [I 08:39:27.901 NotebookApp] The port 9999 is already in use, trying another random port.
[I 08:39:27.901 NotebookApp] The port 10000 is already in use, trying another random port.
[I 08:39:27.902 NotebookApp] The port 10001 is already in use, trying another random port.
[I 08:39:27.905 NotebookApp] Serving notebooks from local directory: /home/user/docs/notebook
[I 08:39:27.905 NotebookApp] 0 active kernels
[I 08:39:27.905 NotebookApp] The Jupyter Notebook is running at: https://[all ip addresses on your system]:10002/
[I 08:39:27.905 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

Кроме того, эти «случайные порты» не кажутся мне случайными.


person Jamie Bull    schedule 27.01.2016    source источник
comment
Правда, вероятно, лучше в SuperUser (хотя блокнот ipython/jupyter определенно является инструментом, используемым сообществом программистов). Как мне его перенести?   -  person Jamie Bull    schedule 27.01.2016
comment
Вы уверены, что команда остановки действительно останавливает службу? Вы можете сделать остановку и netstat -tlnp в сыром виде, чтобы проверить это? Возможно, что остановка только удаляет файл pid, но на самом деле не может остановить службу.   -  person Tom    schedule 27.01.2016
comment
Нет, кажется, это не останавливает службу. Итак, после netstat -tlnp я могу использовать kill [pid], который работает. Спасибо!   -  person Jamie Bull    schedule 27.01.2016
comment
рад, что вы его нашли :) перемещая этот комментарий как ответ для потенциальных других пользователей   -  person Tom    schedule 27.01.2016


Ответы (1)


иногда команда остановки службы не возвращает никакой ошибки и удаляет pid-файл процесса, но на самом деле не завершает сам процесс.

вы можете проверить, выполняется ли процесс, выполнив команду остановки, а затем либо

ps aux | grep -i notebook

or

netstat -tlnp | grep <portNumber>

Как вы сказали, вы можете либо убить процесс вручную, либо исправить сценарий остановки (обычно /etc/init.d/serviceName+d). Причина, по которой процесс не может быть убит, часто (не всегда) связана с разрешениями, принадлежащими пользователю, выполняющему команду.

person Tom    schedule 27.01.2016
comment
Итак, я должен запустить сервер, используя sudo jupyter notebook &, а не просто jupyter notebook &? - person Jamie Bull; 27.01.2016
comment
Нет, этого не может быть. Это дает мне sudo: jupyter: command not found - person Jamie Bull; 27.01.2016
comment
обычно вы предпочитаете посвятить пользователя службе. например, для таких сервисов, как apache, mysql и т. д., вы получите системных пользователей, предназначенных для запуска этих сервисов, с минимальными привилегиями, необходимыми для их запуска. Однако, если безопасность для вас не имеет большого значения, просто делайте то, что работает для вас. Мне трудно сказать, следует ли вам использовать sudo или нет, поскольку я не знаю ни ваших системных настроек/пользователей/прав/путей/и т. д., ни службы jupyter :) - person Tom; 27.01.2016