Как приостановить скрипт Python, работающий в терминале - PullRequest
3 голосов
/ 25 декабря 2011

У меня есть скрипт Python для веб-сканирования, работающий в терминале в течение нескольких часов, который постоянно заполняет мою базу данных.Он имеет несколько вложенных циклов.По некоторым причинам мне нужно перезагрузить компьютер и продолжить сценарий именно с того места, где я ушел.Можно ли сохранить состояние указателя и возобновить ранее запущенный скрипт в терминале?

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

Обновление : Спасибо за предложение виртуальной машины.Я возьму это.Ради завершения, какие общие изменения должны быть внесены в сценарий, чтобы сделать его приостановленным и возобновляемым?

Update2 : Портирование на ВМ работает нормально.Я также изменил скрипт, чтобы он стал защищенным от сбоев в сети.Код написан ниже.

Ответы [ 6 ]

4 голосов
/ 25 декабря 2011

Вы можете попытаться приостановить работу своего компьютера или запустить его на виртуальной машине, которую впоследствии можете приостановить. Но поскольку ваш сценарий работает с сетевыми подключениями, скорее всего, ваш сценарий не будет работать с той точки, которую вы оставили после запуска системы. Приостановка работы компьютера и его восстановление или сохранение Virtual M / C и его восстановление означают, что вам необходимо восстановить сетевое соединение. Это верно для любых элементов, которые являются внешними по отношению к вашей системе, и сеть является одним из них. И есть большая вероятность, что если вы используете динамическую сеть, то при следующей загрузке вы получите новый IP-адрес, и состояние сети, в которой вы работали ранее, будет недействительным.

Если вы планируете изменить скрипт, вам нужно помнить о нескольких вещах.

  1. Добавить возможности сериализации и десериализации. В Python есть метод pickle и более быстрый метод cPickle.
  2. Добавить точки перезапуска. Лучший способ сделать это - сохранять состояние через регулярные промежутки времени, а при перезапуске сценария перезапускать из последнего сохраненного состояния после создания всех переходных элементов, таких как сеть.

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

Примечание ***

О второй мысли. Есть одна альтернатива от изменения вашего сценария. Вы можете попробовать использовать облачные решения для виртуализации, такие как Amazon EC2.

1 голос
/ 26 декабря 2011

Я перенес свой скрипт на ВМ и запустил его оттуда.Однако после выхода из спящего режима были проблемы с сетевым подключением.Вот как я решил эту проблему путем настройки скрипта Python:

import logging
import socket
import time
socket.setdefaulttimeout(30) #set timeout in secs
maxretry = 10  #set max retries
sleeptime_between_retry = 1 #waiting time between retries

erroroccured = 0
while True:
    try:
        domroot = parse(urllib2.urlopen(myurl)).getroot()
    except Exception as e:
        erroroccured += 1
        if erroroccured>maxretry:
            logger.info("Maximum retries reached. Quitting this leg.")
            break
        time.sleep(sleeptime_between_retry)
        logging.info("Network error occurred. Retrying %d time..."%(erroroccured))
        continue
    finally:
        #common code to execute after try or except block, if any
        pass
    break

Эта модификация сделала мой скрипт устойчивым к сбоям сети.

1 голос
/ 25 декабря 2011

Поскольку вы заполняете базу данных своими данными, я предлагаю использовать ее для отслеживания хода выполнения сценария (проанализировать последний URL-адрес, получить список ожидающих URL-адресов и т. Д.).

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

Когдасценарий повторяется, сохраняются только данные для полностью обработанных URL-адресов, и вы можете возобновить выбор следующего URL-адреса в соответствии с базой данных.

1 голос
/ 25 декабря 2011

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

0 голосов
/ 25 декабря 2011

WinPDB - это отладчик Python, который поддерживает удаленную отладку. Я никогда не использовал его, и не знаю, требует ли для удаленной отладки запущенного процесса модификации скрипта (что весьма вероятно, иначе это было бы проблемой безопасности); но если возможна удаленная отладка без изменения сценария, вы можете записать текущее состояние сценария в файл и выяснить, как его загрузить. Я не думаю, что это сработает.

0 голосов
/ 25 декабря 2011

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

...