Блог им. AVBacherov

Осваивая LINUX, nohup и disown - что за звери

Linux

Если вы не только что стали моим подписчиком, то наверняка в курсе, что я полностью перешел на Linux и даже написал пост о моем опыте: Месяц на ALT Linux на рабочей машине...

Но сейчас хотел поделиться кое-чем полезным, а заодно останется это в ленте, потому что когда ты редко пользуешься чем-то, то забываешь, и нужно снова вспоминать. Поэтому данный пост также послужит лично мне напоминалкой.

Сейчас люди настолько привыкли к графическим оболочкам (линуксоиды их называют ГУИ, GUI — Graphical user interface), что мало кто представляет себе возможность что-то делать на компьютере с помощью командной строки. А между тем, командная строка очень мощный и в определенных случаях очень полезный инструмент. В Linux его довели до совершенства. Конечно, большинству людей она не понадобится, но при этом она остается очень полезной сисадминам и программистам.

Мои программы написаны на python и их очень удобно запускать прямо из командной строки. Достаточно написать:

python3 my_python_script.py

И программа начинает выполняться, выдавать расчеты, графики и т.п.

Но бывают случаи, когда программы имеют сервисный характер. Например, мне нужно в свою базу SQL дописать новые данные по котировкам, дивидендам, процентным ставкам и т.п. Или как в случае с расчетам большого числа статистических показателей, с последующим их сохранением в той же SQL. Запустить такой скрипт из под своей учеткой можно, но придется ждать когда он закончит работу, потому что при выходе из учетки будут остановлены все процессы запущенные пользователем. Конечно, можно оставить компьютер включенным на ночь, пусть работает, а потом утром прийти и посмотреть что получилось. Но куда как лучше пойти более правильным путем.

Мы привыкли в ГУИ запускать сразу много процессов/программ. Сейчас мы не задумываемся об этом, но это режим многозадачности, к которому путь был не столь прост. Это прекрасно помнят те, кто начинал знакомства с компьютерами, еще когда были такие операционные системы как DOS. В командной строке чтобы реализовать этот процесс, придется немного постараться. Когда мы пишем команду или запускаем программу/скрипт, то он начнет выполняться и пока не закончится его работа, доступ для вводу следующей команды будет заблокирован. Чтобы можно было работать параллельно с несколькими программами в командной строке Linux придумали возможность запускать программы в фоновом режиме. Для этого в конце строки после ввода команды достаточно поставить значок "&". Тогда команда будет выполняться, а вы можете продолжить вводить другие команды. Но проблема в том, что если вы отключитесь от терминала как пользователь, то такие процессы тоже будут остановлены, а правильнее сказать завершаться. Получается, что запуск в фоном режиме сервисного ПО не дает преимуществ, так как все равно придется оставить тот компьютер включенным, с которого вы эти команды подавали. Например, я подключился к своему серверу с помощью удаленного подключения через терминал (есть такой протокол SSH) и запустил выполнение в фоновом режиме своего сервисного скрипта написанного на python. Как только я отключусь от сервера, работа этого скрипта будет прекращена. Получается, я все равно вынужден оставить свой компьютер в рабочем режиме, и более того не отключаться от терминала. А если произойдет какой-то сбой на сети и меня просто выкинет с удаленного подключения. Это тоже приведет к остановки выполнения программы на сервере. Поэтому мне не достаточно запустить программу в фоновом режиме. Мне надо сделать так, чтобы при отключении она продолжала выполняться на сервере.

В Linux это можно реализовать следующим интересным и простым способом.

Есть такая команда nohup. Она позволяет запустить выполнения программы в фоновом режиме и организовать вывод лога (то что программа нам выдает при ее выполнении) в отдельный файл. Тогда запуск моего скрипта python будет выглядеть так:

nohup python3 my_python_script.py > log.txt &

Теперь программа будет выполняться а все что она выдает будет записано в файл log.txt

С помощью команды:

jobs -l

я могу посмотреть, какие сейчас выполняются команды запущенные мной, а также их ID присвоенный компьютером. Но проблема все равно остается в том, что при отключении от терминала, эти процессы будут завершены.

Чтобы не дать им завершится, мне надо «перенести» или правильно сказать «отвязать» выполнение моего скрипта от терминала с которого я его запустил. Для этого я подам еще одну команду:

disown ID

После нее процесс выполнения моей команды уже не будет привязан к моему терминалу, и она сможет выполняться даже после моего выхода или потери соединения с сервером. Но тогда я уже не смогу посмотреть с помощью «jobs -l» выполняется моя программа или нет. Для этого я должен буду использовать другую команду:

ps -aux

или если я хочу посмотреть только те команды выполнения, которые связанны с python, то:

ps -aux | grep python

Таким образом, я в итоге могу подключиться к серверу, запустить в фоновом режиме выполнение своего скрипта python, отвязать его от текущего терминала и отключиться, зная что он продолжит выполняться до тех пор пока не закончит свою работу. При этом я могу в любой момент снова подсоединится к серверу и проверить, продолжает ли скрипт выполняться. А также посмотреть в log.txt процесс его выполнения.

Например на следующих двух скринах показан лог по расчету статистических показателей по 51-ой акции для глубин 1, 3, 5 и 10 лет, с последующей записью их в SQL.
Осваивая LINUX, nohup и disown - что за звери
Осваивая LINUX, nohup и disown - что за звери

Это очень удобно. Мне нет необходимости держать включенным мой рабочий компьютер, а подобные сервисные вещи можно легко делать удаленно. Не стоит говорить, что можно написать отдельный скрипт, который вообще будет запускаться автоматически на сервере, выполнять все программы и записывать их в лог.

Автоматизируйте свои исследования в области инвестиций. Это экономит массу времени.

★6
20 комментариев
Просто впиши в крон с нужным таймингом. Зачем это все? Подключаться, запускать ручками. Есть прекрасный cron. Все сделает сам.
avatar
Доктор, спасибо буду учиться дальше

Доктор, этож альтлинукс))

у них бессмысленные действия — девиз))

попробуйте пользоваться tmux — это проще чем вот это вот всё ;)
Андрей Александрович, да, пока разбирался с этим вопросом, читал, что есть tmux. Надо попробовать.
Алексей Бачеров, столько текста написать стоило для того, чтобы узнать что есть tmux, да )
Танцы с бубном
avatar
третий год Минт как установлен на стационарный системник под сокет2011 6ядер-12потоков и сутками не отключается.
обновляется и без всяких там впн в лисе настроил адблок всей рекламы!
тор воткнул ходить на некоторые ресурсы.
через кюркод параллельно открывает соцсети что и на телефоне .
если в игрушки не рубитесь то и винда не нада!
хватитает и смотреть ютуб и кинозалы.
avatar
ПлощадьДНР, тоже начинал с Mint, но потом всё-таки решил перебраться на ALT 
Алексей Бачеров, с рэдхатом знаком с начала 2000х г.г.,
пользовался системами сбора данных и делал бекапы на стримеры-ленточные ибм и тп экзобайты сказевые..
мало-мало пришлось изучать работу через терминал,
было много всего !
небыло интерфейса удобного еще, вином из строки мультимедиа запускали смотреть..
игрушки аркады еще типа мальстрима и рэйс с пингвином.
так нынешний алт и минт это уже теперь как проще некуда!
avatar
nohup python3 my_python_script.py > log.txt &
только нужно вот так делать
nohup python3 my_python_script.py &> log.txt &

так как просто > редиректит только стандартный поток вывода в лог, а есть ещё поток ошибок, и &> редиректит их в файл обоих
avatar
kiryushka, спасибо, попробую
Линукс прикольный после винды. Но что касается трейдинга, установил quik на Линукс, очень криво работает, до последней версии не обновляется. Не все приложения там поддерживаются.
avatar
Александр, из почтения к старости и добрости квика можно установить его в виртуальную машину с виндой, виртуалбокс какой-нибудь тебе в помощь )
Александр, а чего там криво выходит? 
avatar
а как насчет софта и игр на виндовс?
все это и в винде можно делать, может оно не так органично, поскольку в никсах это изначально заложено — запуск любой программы в консольном режиме..

например, просмотр видео прямо в консоли, без всякой гуи…
avatar
Алексей Бачеров, плюсанул. Котировки где берете? Сам немного на питоне балуюсь)
Какие показатели считаете, это типа машинное обучение?
avatar
А ещё в Linux есть команда screen )
avatar

теги блога Алексей Бачеров

....все тэги



UPDONW
Новый дизайн