Run python script in screen

Run python script in background

If you want to run a python script in the background you can use an ampersand(&). But at first, we need to prepare our script for this.

For example, we have a python file my_script.py . At first, we need to add execution permission for this file using the next command:

Then I recommend adding a shebang line to the top of this file. This allowed you don’t indicate in the terminal that it is a python script.

Now we need some logic that will show us that the script is running in the background. For example, a simple script that will have been printing time during the next ten seconds.

#!/usr/bin/env python3 from datetime import datetime start_time = datetime.now() print(f"Start time: ") interval = 10 while interval != 0: if (datetime.now() - start_time).seconds == 1: start_time = datetime.now() print(f"Current time: ") interval -= 1 

Using only ampersand (&)

For running the script use the next command:

your/path/my_script.py > output.log &

We save the script’s output to the log file, so after running this command we will get output like this in the terminal:

This is a process id (PID). If you want to stop the script before its ending you can use the kill command:

Читайте также:  .

It is also possible to kill the process by using pkill command. If you run a few scripts with the same name they all will be stopped.

We can see our process using the next command:

3010186 pts/0 R 0:03 python3 ./my_script.py 3012286 pts/1 S+ 0:00 grep --color=auto my_script.py

After finishing the process all script output will be saved to output.log. It has the next content:

Start time: 10:46:21 Current time: 10:46:22 Current time: 10:46:23 Current time: 10:46:24 Current time: 10:46:25 Current time: 10:46:26 Current time: 10:46:27 Current time: 10:46:28 Current time: 10:46:29 Current time: 10:46:30 Current time: 10:46:31 

The background script seems to work perfectly, but it’s not quite true. For example, if you use ssh session connection, the disconnect will stop our script. As a solution, you could use nohup or a better screen. This allows us to return to the script after reconnecting the session.

Using the ‘screen’ command for background scripts

At first, you need to install the screen. Use the next command for this:

Now we can run our script using the screen command. We need a little to modify the command for the identical logging as in the previous heading. For that, we need to add the next keys: -L for resolving logging and -Logfile path/to/filename.log to indicate log file (by default screenlog.0)

screen -L -Logfile ./output.log ./my_script.py & 

Despite the screen output, logging still saves to our log file.

Let’s check the process list during performing the screen command using the next command:

3038184 pts/0 S 0:00 screen -L -Logfile ./output.log ./my_script.py 3038185 ? Ss 0:00 SCREEN -L -Logfile ./output.log ./my_script.py 3038186 pts/3 Rs+ 0:03 python3 ./my_script.py 3038214 pts/1 S+ 0:00 grep --color=auto my_script.py

You can also detach the screen using Ctrl + a and also return back to the screen using the command screen -r.

Источник

Запускаем процессы в фоне с помощью screen

Taly

Работая через терминал, вы запускаете процессы в текущей сессии. Если закрыть окно, выполнение процесса будет завершено, а результат утерян. Это является проблемой при выполнении ресурсоемких задач (сложных sql-запросов, работы с большими объемами данных и так далее), которые могут занять продолжительное время. К тому же, любая запущенная команда блокирует терминал до своего завершения, лишая вас возможности выполнять другие операции.

Для решения этой проблемы существует терминальный менеджер screen. Он запускает процессы в собственных сессиях, которые не завершаются при выходе пользователя из системы. Таким образом вы можете закрыть терминал, оставив какие-то процессы работающими в фоне, и в любой момент вернуться к ним.

Помимо выполнения долгих скриптов, screen можно использовать для запуска программ, которые должны работать на сервере в фоне. Например, мы нередко используем его для запуска проектов на nodejs или python, работы shell-скриптов. Для запуска фоновых процессов на продакшн-сервере лучше использовать утилиту supervisor, которая создана специально для этих задач, но screen проще и удобнее для тестирования и отладки приложений.

В этой статье рассказывается о базовых командах, которые могут пригодиться для запуска ваших процессов. Подробную документацию по screen можно найти на официальном сайте.

Установка

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

Работа с сессиями

Попробуем создать новую сессию:

Будет запущена новая сессия, как если бы вы авторизовались на сервере в обычной tty-консоли. В ней можно запустить какой-то процесс, «свернуть» ее и продолжить работать в консоли.

Чтобы «свернуть» сессию, нажмите Ctrl+A, затем d. Первый шорткат переведет скрин режим принятия команд, а команда d (disconnect) отключится от текущей сессии, оставив ее запущенной в фоне.

Чтобы вернуться к последней подключенной сессии, введите команду

Для того, чтобы получить список запущенных сессий от имени текущего пользователя, добавьте ключ -ls или -list

Вы можете подключиться к определенной сессии по её имени (идентификатору), добавив его в конце команды

Чтобы завершить определенную сессию, можно отправить в нее выполнение команды «quit»

Запуск процесса в фоне

Чтобы сразу запустить в скрине какой-то процесс, достаточно передать команду на его выполнение при запуске сессии

Перед вами откроется новый скрин, где будет выполняться переданная команда. Теперь можно свернуть скрин и процесс продолжит выполнение. Ctrl+A, D.

Важно помнить, что при подобном запуске, если процесс завершит свое выполнение (например, вследствие ошибки), то скрин также завершит работу. Если вы хотите иметь возможность посмотреть вывод процесса (узнать текст ошибки) в случае остановки скрипта в скрине, запускайте его в два этапа: сперва создаем сессию, потом запускаем в ней процесс — так вы сможете зайти в скрин с помощью -r

Запуск процесса в новой сессии в фоне

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

Рекомендуется либо заранее проверить, что переданная команда запускается корректно. Иначе вы увидите только сообщение о том, что скрин завершил работу.

Вывод

Screen позволяет использовать терминальные сессии, которые можно «сворачивать». С его помощью можно запускать в фоне ресурсоемкие задачи и процессы, которые должны быть запущены постоянно.

Read more

We talk about interesting technologies and share our experience of using them.

Источник

Start a python script in `screen` on boot?

Alternativly — if you only wish to have logs from your program — maybe simpler is redirect output to syslog? for example:

sudo python /path/to/file.py|logger 

If you wish also redirect standard errror output, don’t forget about 2>&1:

sudo python /path/to/file.py 2>&1 |logger 

How to run a startup script using systemd

Start Python Programs as your Raspberry Pi boots up

How to Autorun/Autostart Your Python Script in the Raspberry Pi OS

Python Automation project : Run Python scripts Automatically in backgroud on windows startup

Unix & Linux: Start a python script in `screen` on boot?

goldilocks

goldilocks

Gentleman programmer and linux enthusiast; raised by bears. o_O? «You are lost in the Real.» (Baudrillard) http://cognitivedissonance.ca/cogware/

Updated on September 18, 2022

Comments

goldilocks

I want to be able to start a python script when I boot, but I want to be able to see lines which have been printed during the program. I have been able to put the line «sudo python /path/to/file.py» into /etc/rc.local but of course I can’t then see the output. Is it possible to put some kind of line in there to start the program in a screen terminal and which I can then access when I SSH in? — maybe something along the lines of.

screen sudo python /path/to/file.py 

goldilocks

I’d suggest you write whatever to a file in /tmp instead and then have ssh, etc. use it as a greeting (dunno if ssh has greetings, I’d think the ascii artists of the world would already have beat down doors about that). Put another way, you might want to consider the XY problem here.

Источник

Оцените статью