
В сценариях, где требуется автоматическое выполнение Python-скрипта после завершения работы системы, важно учитывать этап завершения сеанса, поведение служб и порядок остановки процессов. Например, при резервном копировании, логировании активности или очистке временных файлов запуск скрипта должен происходить точно после завершения пользовательской сессии или перед выключением питания.
На системах Linux это реализуется с помощью unit-файлов systemd с типом shutdown или с использованием директорий /lib/systemd/system-shutdown/ и /etc/rc0.d/. Скрипты из этих директорий запускаются при выключении системы в порядке приоритета. Обязательное условие – наличие прав на выполнение и корректное завершение выполнения скрипта в течение ограниченного времени, заданного в настройках systemd.
В Windows для автозапуска Python-скрипта при завершении работы можно использовать групповые политики или планировщик заданий (Task Scheduler). В планировщике необходимо создать задание с триггером On an event и указанием событий журнала Windows с ID 1074 (завершение работы), 6006 (остановка службы журналирования) или 6005 (запуск системы), в зависимости от требуемого момента выполнения.
Скрипт должен обрабатывать возможные ограничения среды завершения, например, отсутствие доступа к сетевым ресурсам, переменным окружения или файлам пользователя. Для повышения надёжности рекомендуется использовать логирование в файл и проверку завершения ключевых операций по exit-кодам.
Отслеживание завершения процесса через psutil

Модуль psutil позволяет получать информацию о процессах в системе и отслеживать их завершение. Для контроля завершения конкретного процесса достаточно знать его PID. Если PID неизвестен заранее, можно отфильтровать процессы по имени или аргументам запуска.
Пример отслеживания завершения процесса по PID:
import psutil
import time
pid = 1234 # замените на нужный PID
try:
proc = psutil.Process(pid)
while proc.is_running():
time.sleep(1)
except psutil.NoSuchProcess:
pass
# здесь можно вызвать нужный скрипт
Если необходимо отслеживать процесс по имени:
import psutil
import time
import subprocess
def find_process_by_name(name):
for proc in psutil.process_iter(['name']):
if proc.info['name'] == name:
return proc
return None
while True:
proc = find_process_by_name("example.exe")
if proc:
while proc.is_running():
time.sleep(1)
break
time.sleep(1)
subprocess.run(["python", "script.py"])
Если ожидается, что нужный процесс может запускаться несколько раз, следует дополнительно фильтровать по команде запуска:
def find_target():
for proc in psutil.process_iter(['cmdline']):
cmd = proc.info['cmdline']
if cmd and "some_arg" in cmd:
return proc
return None
Использование is_running() безопасно, но между вызовами процесс может завершиться, вызывая psutil.NoSuchProcess. Всегда используйте try-except при работе с экземплярами Process.
Настройка автозапуска с помощью systemd в Linux
Для запуска Python-скрипта после завершения работы системы можно создать unit-файл systemd с типом shutdown. Скрипт будет выполняться при остановке системы, перезагрузке или выключении.
- Создайте unit-файл:
sudo nano /etc/systemd/system/myscript.service - Пропишите содержимое:
[Unit] Description=Выполнение Python-скрипта при завершении работы DefaultDependencies=no Before=shutdown.target reboot.target halt.target [Service] Type=oneshot ExecStart=/usr/bin/python3 /opt/myscript/script.py RemainAfterExit=true [Install] WantedBy=halt.target reboot.target shutdown.target - Проверьте права доступа к скрипту:
chmod +x /opt/myscript/script.py - Перезагрузите systemd:
sudo systemctl daemon-reexec - Активируйте сервис:
sudo systemctl enable myscript.service
Если скрипт требует сетевых ресурсов, укажите зависимость:
After=network.target
ExecStart=/usr/bin/python3 /opt/myscript/script.py >> /var/log/myscript.log 2>&1
Проверка статуса:
sudo systemctl status myscript.service
Использование планировщика задач Windows для отслеживания завершения

Для запуска Python-скрипта после завершения другого процесса можно использовать планировщик задач Windows, настроив задачу на событие завершения процесса.
Откройте Планировщик заданий (taskschd.msc), создайте новую задачу через пункт Создать задачу. На вкладке Триггеры нажмите Создать и выберите Начать задачу: При регистрации события. В поле Журнал выберите Система, Источник – Service Control Manager, Идентификатор события – 7036.
Этот ID фиксирует изменение состояния службы. Чтобы отследить завершение конкретного процесса, потребуется либо запускать процесс как службу, либо использовать стороннюю утилиту (например, Process Monitor с логированием в журнал событий).
На вкладке Действия добавьте запуск python.exe с аргументом пути к вашему скрипту, например: python.exe C:\scripts\finish_task.py. Убедитесь, что путь к интерпретатору указан без ошибок. Включите опцию Запускать с наивысшими правами на вкладке Общие, если скрипт требует доступа к системным ресурсам.
Проверьте условия и параметры завершения на одноимённых вкладках. Убедитесь, что задача разрешена на выполнение при любой активности системы и что повторные попытки включены, если задача критична.
После сохранения задача будет срабатывать при каждом фиксируемом событии завершения выбранного процесса или службы, что обеспечит запуск Python-скрипта без ручного вмешательства.
Перехват завершения процесса с помощью обработчиков сигналов
Для работы с сигналами в Python используется модуль signal. Этот модуль предоставляет функции для регистрации обработчиков, которые могут перехватывать и обрабатывать различные сигналы, отправляемые процессу. Для перехвата сигнала завершения процесса применяется функция signal.signal(), с которой можно назначить функцию-обработчик.
Пример использования обработчика для сигнала SIGTERM:
import signal
import sys
def handler(signum, frame):
print("Процесс завершён.")
sys.exit(0)
signal.signal(signal.SIGTERM, handler)
Сигнал SIGTERM – это стандартный сигнал для завершения процесса, который можно отправить с помощью команды kill в операционной системе. Важно отметить, что обработчики сигналов выполняются в контексте основного процесса, поэтому они не должны содержать долгих или блокирующих операций.
Для более точного контроля над завершением можно перехватывать и другие сигналы, такие как SIGINT (обычно генерируется при нажатии Ctrl+C) или SIGQUIT. Каждому сигналу можно назначить свой обработчик, который будет выполнять разные действия в зависимости от типа события.
Кроме того, важно помнить, что обработчики сигналов работают только в том случае, если процесс не был принудительно завершён (например, с помощью SIGKILL), так как этот сигнал не может быть перехвачен. Это делает обработчики сигналов полезными в ситуациях, когда нужно корректно завершить работу при обычных или ожидаемых завершениях процесса.
Для обеспечения более надёжной работы можно добавлять логику для повторных попыток, если процесс не завершился по каким-то причинам, или использовать другие механизмы для мониторинга, такие как использование внешних утилит или демонских процессов, отслеживающих статус работы программы.
Организация очереди задач через Redis и Celery
Использование Redis и Celery для организации очереди задач позволяет эффективно управлять асинхронными задачами в Python-программах. Redis служит в качестве брокера сообщений, а Celery – инструментом для обработки и выполнения этих задач. Вместе они обеспечивают масштабируемость и гибкость при решении задач, которые требуют задержек или долгосрочного выполнения.
Для начала необходимо настроить Redis как брокер для Celery. В конфигурации Celery указывается URL подключения к Redis, например: broker = 'redis://localhost:6379/0'. Это позволит Celery отправлять и получать сообщения через Redis. Для работы с Redis потребуется установить библиотеку redis-py, а для Celery – celery.
После настройки брокера можно переходить к созданию задач. Celery поддерживает два основных типа задач: обычные задачи и периодические задачи. Обычные задачи выполняются по запросу, а периодические могут быть запланированы на выполнение в определенные интервалы времени. Пример простой задачи:
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def add(x, y):
return x + y
Для выполнения задачи достаточно вызвать метод add.delay(4, 6), и Celery поместит её в очередь. Celery будет периодически проверять очередь и, при наличии задач, выполнять их.
Для масштабируемости можно использовать несколько рабочих процессов Celery, что позволяет обрабатывать множество задач параллельно. Каждый рабочий процесс будет обрабатывать задачи из очереди Redis. Для запуска нескольких рабочих процессов достаточно выполнить команду:
celery -A tasks worker --loglevel=info
Помимо этого, Celery предоставляет возможности для контроля над выполнением задач. Вы можете отслеживать статус задач, проверять, завершена ли задача, и получать результаты. Для этого используется объект AsyncResult, который позволяет отслеживать выполнение задач:
result = add.delay(4, 6)
if result.ready():
print(result.result)
Для более сложных сценариев можно настроить периодические задачи, которые будут выполняться через определенные интервалы. Это можно сделать с помощью Celery Beat – расширения для планирования задач. Например, для выполнения задачи каждую минуту можно использовать следующий конфиг:
from celery import Celery
from celery.schedules import crontab
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def my_periodic_task():
print("Задача выполняется!")
app.conf.beat_schedule = {
'execute-every-minute': {
'task': 'my_periodic_task',
'schedule': crontab(minute='*/1'),
},
}
Использование Celery и Redis для организации очереди задач позволяет не только распределить нагрузку между несколькими процессами, но и эффективно управлять длительными операциями. Это идеальный выбор для задач, требующих высокой производительности и масштабируемости.
Создание фонового сервиса с проверкой состояния процессов

Для автоматического запуска Python-скрипта после его завершения можно использовать фоновый сервис, который будет не только запускать скрипт, но и отслеживать его состояние. Такой подход позволяет минимизировать возможность незапланированных остановок или зависаний процесса, а также гарантировать, что скрипт будет работать непрерывно.
Для реализации фонового сервиса на Linux можно использовать systemd. Для этого необходимо создать unit-файл, который будет управлять запуском, остановкой и проверкой состояния процесса. Пример конфигурации:
[Unit] Description=Python script service After=network.target [Service] ExecStart=/usr/bin/python3 /path/to/your/script.py Restart=always User=youruser WorkingDirectory=/path/to/your StandardOutput=syslog StandardError=syslog SyslogIdentifier=python-script [Install] WantedBy=multi-user.target
Ключевые моменты:
ExecStartуказывает путь к Python и скрипту, который нужно выполнить.Restart=alwaysобеспечивает перезапуск скрипта в случае его завершения или сбоя.WorkingDirectoryзадает рабочую директорию для выполнения скрипта, что важно для правильной работы с файлами и настройками.
Для создания подобного сервиса необходимо сохранить файл с расширением .service в директорию /etc/systemd/system/, после чего выполнить команду:
sudo systemctl daemon-reload sudo systemctl enable your-service-name.service sudo systemctl start your-service-name.service
Теперь сервис будет автоматически запускаться при старте системы и перезапускаться при любых сбоях. Для контроля за состоянием процесса можно использовать команду:
systemctl status your-service-name.service
Если необходимо проверить, работает ли скрипт в данный момент, можно использовать команду ps или pgrep для поиска процесса по имени скрипта:
ps aux | grep script.py
или
pgrep -fl script.py
Это позволяет оперативно мониторить состояние сервиса и принимать меры в случае ошибок или зависаний. В случае ошибок можно настроить уведомления через email или другие системы мониторинга, такие как Zabbix или Prometheus, чтобы получать информацию о сбоях или критических ситуациях в процессе выполнения скрипта.
Логирование и уведомления при автозапуске

Для логирования часто используется встроенный модуль logging. Он позволяет записывать события в файл с указанием уровня важности (например, DEBUG, INFO, WARNING, ERROR). Это важно, чтобы различать обычные сообщения о выполнении скрипта от ошибок.
Пример базовой настройки логирования:
import logging
logging.basicConfig(filename='script.log', level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
logging.info('Скрипт запущен')
В случае ошибок или необычных событий скрипт может автоматически отправлять уведомления, чтобы оперативно информировать пользователя. Это может быть сделано через email, Telegram или другие мессенджеры. Для уведомлений через email часто используется модуль smtplib, а для Telegram – python-telegram-bot.
Для уведомления об ошибке через email, пример кода:
import smtplib
from email.mime.text import MIMEText
def send_error_email(error_message):
msg = MIMEText(error_message)
msg['Subject'] = 'Ошибка в Python-скрипте'
msg['From'] = 'your_email@example.com'
msg['To'] = 'recipient@example.com'
with smtplib.SMTP('smtp.example.com', 587) as server:
server.starttls()
server.login('your_email@example.com', 'password')
server.sendmail('your_email@example.com', 'recipient@example.com', msg.as_string())
При использовании Telegram для уведомлений можно создать бота и получать сообщения о событиях:
import telegram
def send_telegram_message(message):
bot = telegram.Bot(token='YOUR_BOT_API_KEY')
bot.send_message(chat_id='YOUR_CHAT_ID', text=message)
Автоматическая настройка уведомлений о завершении работы скрипта или в случае ошибок значительно улучшает контроль за выполнением задач. Если скрипт запущен по расписанию, уведомления помогают сразу узнать о возможных сбоях или о завершении работы без необходимости вручную проверять логи.
- Для обеспечения надежности уведомлений рекомендуется использовать несколько каналов: логирование в файл + email или мессенджеры.
- Для более сложных систем можно интегрировать мониторинг в инструменты для автоматического анализа логов, такие как ELK Stack (Elasticsearch, Logstash, Kibana).
- Важно учесть, что слишком частые уведомления могут вызвать спам, поэтому целесообразно настраивать уровни важности сообщений и частоту уведомлений.
Вопрос-ответ:
Как настроить автозапуск Python-скрипта после завершения его работы?
Для настройки автозапуска Python-скрипта после его завершения можно использовать несколько подходов. Один из самых популярных методов — использование бесконечного цикла внутри самого скрипта. Например, можно добавить конструкцию `while True` с запуском основного кода, а после его завершения программа будет автоматически перезапускать себя. Также можно настроить задачу через планировщик задач операционной системы, как в Windows (Task Scheduler), так и в Linux (cron). В таком случае, задача будет перезапускаться по расписанию или при определенных условиях.
Можно ли автоматически запускать скрипт после его завершения, используя только возможности Windows?
Да, в Windows для этого можно использовать «Планировщик заданий» (Task Scheduler). Нужно создать задачу, которая будет запускаться при определенных условиях, например, по завершении работы скрипта или при запуске системы. В задаче можно указать путь к Python-скрипту и настроить параметры повторного запуска, чтобы скрипт автоматически выполнялся после завершения.
Как настроить автозапуск Python-скрипта после завершения работы другого скрипта?
Для настройки автозапуска Python-скрипта после завершения работы другого можно использовать несколько подходов. Один из самых простых способов — это создание цепочки из двух скриптов, где второй скрипт запускается после завершения первого. Для этого в первом скрипте можно использовать конструкцию `subprocess.run()`, которая запускает второй скрипт по завершении первого. Также стоит рассмотреть использование планировщика задач (например, Cron на Linux или Task Scheduler на Windows), который будет следить за состоянием выполнения первого скрипта и запускать второй по завершению. Важно настроить правильное отслеживание завершения первого скрипта, чтобы второй запускался только после его полной работы.
Что делать, если я хочу запускать Python-скрипт после завершения работы приложения на компьютере?
Для того чтобы Python-скрипт запускался после завершения работы приложения, можно использовать несколько методов. Один из них — это мониторинг процесса с помощью библиотеки `psutil`. Этот инструмент позволяет отслеживать работу приложений и запускать другие процессы по событию, когда нужная программа завершится. В скрипте можно написать цикл, который будет проверять, работает ли приложение, и как только оно завершится, автоматически запустит следующий Python-скрипт. Также можно использовать систему планировщика задач, которая будет запускать скрипт при условии завершения процесса. Это особенно удобно, если вы хотите настроить выполнение скрипта на конкретное событие в системе.
