russian_bear
Янв. 1, 2015 13:43:54
здравствуйте друзья,
Есть следующая проблема - есть некая софтина на python (soft_1.py) которая занимается обработкой неких больших массивов текстовых данных, в силу ряда причин эта софтина иногда “подвисает” / просто останавливается. Задача - нужно какой-то доп. внешней программой(soft_2.py) перезапускать прогу soft_1.py. Критерии по которым должна срабатывать прога для перезапуска у меня есть (прекращение изменения выходного файла output.txt ), запустить прогой soft_2.py прогу soft_1.py - элементарно, т.е. остается одна основная проблема - как софтиной soft_2.py “прибить” процесс soft_1.py ? (работает в Windows 7)
спасибо
ajib6ept
Янв. 1, 2015 14:31:40
Через TASKKILL можно завершить процесс
terabayt
Янв. 1, 2015 15:10:58
soft_1.py
import os
import sys
pid = str(os.getpid())
pidfile = "test.pid"
if os.path.isfile(pidfile):
print "%s уже существует. заверште программу" % pidfile
sys.exit()
else:
file(pidfile, 'w').write(pid)
# ваш код
os.unlink(pidfile)
soft_2.py
import os
import signal
pidfile = "test.pid"
# если выполняется условие (прекращение изменения выходного файла output.txt ), то
os.kill(int(file(pidfile).readline()), signal.SIGQUIT)
JOHN_16
Янв. 2, 2015 09:13:48
terabayt
Первый раз запуститься soft_1 нормально, создаст pid-файл, затем подвиснет. soft_2 ее благополучно убьет, и запустить soft_1, которая в свою очередь запуститься, увидит что pid-файл уже есть и закроется. Тупик, потому что os.unlink() никогда не сработает, ибо до нее в разделе “ваш код” будет прерывание работы программы. Выходов несколько, но самый простой будет в soft_2 удалять pid-файл.
Rodegast
Янв. 2, 2015 13:22:31
> Есть следующая проблема - есть некая софтина на python (soft_1.py) которая занимается обработкой неких больших массивов текстовых данных, в силу ряда причин эта софтина иногда “подвисает” / просто останавливается.
Тебе её не перезапускать, а чинить надо. Костыли могут быть только временным решением.
4kpt_III
Янв. 2, 2015 13:32:29
Rodegast
Все сидел и ждал такого ответа. Плюсую.
terabayt
Янв. 2, 2015 14:06:10
JOHN_16 спасибо, не скопировалась последняя строка, а я и не заметил
вот:
import os
import signal
pidfile = "test.pid"
os.kill(int(file(pidfile).readline()), signal.SIGQUIT)
os.unlink(pidfile)