Форум сайта python.su
0
В общем суть в том, что есть первый скрипт, запускающий демон и есть второй скрипт, который должен его останавливать. Первый скрипт при старте записывает в файл вывод команды os.getpid(), второй скрипт его считывает и запускает os.kill(pid,…), что в теории должно убивать процесс и останавливать программу. Проблема в том, что os.getpid() возвращает иногда нужное значение (в этом случае всё работает корректно), иногда на 1 больше или меньше. (т.е. при выводе ps -A в терминале PID 9586, а os.getpid() возвращает 9585) Может кто-нибудь знает с чем это связано?
Офлайн
52
Покажите код. os.getpid записывает демон или скрипт, запускающий демона?
Офлайн
0
Суть кода такова:
import sys,os,urllib.... def some_action(...): ...... fpid = os.fork() f=open('my_file','w') pid=os.getpid() f.writelines(str(pid)) f.close() if fpid!=0: sys.exit(0) while True: some_action(....) sleep(5)
Офлайн
52
Запустил
import os import sys import time fpid = os.fork() with open('pid_out', 'w') as f: f.write(str(os.getpid())) if fpid != 0: sys.exit(0) while True: time.sleep(10)
import os import sys import time fpid = os.fork() print os.getpid() if fpid != 0: sys.exit(0) while True: time.sleep(10)
[23:55] home:~/dev python scrname.py
17848
17849
Отредактировано fata1ex (Июль 29, 2012 23:17:40)
Офлайн
0
Вообще как-то странновато, что вывод os.getpid() с помощью print содержит два параметра, а в файл записывается только один.
Офлайн
52
Зачем вам вообще getpid? fork возвращает pid потомка, можно просто перед sys.exit делать вывод в файл.
folkman
Вообще как-то странновато, что вывод os.getpid() с помощью print содержит два параметра, а в файл записывается только один.
Отредактировано fata1ex (Июль 30, 2012 00:11:18)
Офлайн
0
fata1exЧто-то я туплю. Можете пояснить на примере? Если вы предлагаете записать fpid в файл, то у меня это благополучно не получилось
Зачем вам вообще getpid? fork возвращает pid потомка, можно просто перед sys.exit делать вывод в файл.
Офлайн
52
Пример всё тот же:
import os import sys import time pid_son = os.fork() if pid_son != 0: # father with open('pid_out', 'w') as f: if.write(str(pid_son)) sys.exit(0) else: # son while True: time.sleep(10)
import os import sys import time if os.fork() != 0: sys.exit(0) with open('pid_out', 'w') as f: f.write(str(os.getpid())) while True: time.sleep(10)
Отредактировано fata1ex (Июль 30, 2012 07:02:28)
Офлайн
0
Сделал с использованием os.fork(), вроде теперь всегда возвращает нужный PID. Спасибо, что помогли разобраться.
Офлайн