Уведомления

Группа в Telegram: @pythonsu

#1 Июль 29, 2012 22:10:44

folkman
Зарегистрирован: 2012-07-29
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с получением PID процесса

В общем суть в том, что есть первый скрипт, запускающий демон и есть второй скрипт, который должен его останавливать. Первый скрипт при старте записывает в файл вывод команды os.getpid(), второй скрипт его считывает и запускает os.kill(pid,…), что в теории должно убивать процесс и останавливать программу. Проблема в том, что os.getpid() возвращает иногда нужное значение (в этом случае всё работает корректно), иногда на 1 больше или меньше. (т.е. при выводе ps -A в терминале PID 9586, а os.getpid() возвращает 9585) Может кто-нибудь знает с чем это связано?

Офлайн

#2 Июль 29, 2012 22:17:39

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Проблема с получением PID процесса

Покажите код. os.getpid записывает демон или скрипт, запускающий демона?



Офлайн

#3 Июль 29, 2012 22:36:48

folkman
Зарегистрирован: 2012-07-29
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с получением PID процесса

Суть кода такова:

 
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)

Офлайн

#4 Июль 29, 2012 22:52:21

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Проблема с получением PID процесса

Запустил

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)
7 раз и вывод cat pid_out соответствовал ps aux | grep ‘python scrname.py’.

Можете попробовать http://pypi.python.org/pypi/python-daemon/

А вообще, похоже, запись в файл надо бы перенести после sys.exit. Так как:
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)

Офлайн

#5 Июль 29, 2012 23:38:07

folkman
Зарегистрирован: 2012-07-29
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с получением PID процесса

Вообще как-то странновато, что вывод os.getpid() с помощью print содержит два параметра, а в файл записывается только один.

Офлайн

#6 Июль 30, 2012 00:09:52

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Проблема с получением PID процесса

Зачем вам вообще getpid? fork возвращает pid потомка, можно просто перед sys.exit делать вывод в файл.

folkman
Вообще как-то странновато, что вывод os.getpid() с помощью print содержит два параметра, а в файл записывается только один.

Эээ, да вам надо бы почитать про процессы для начала. Что-нибудь базовое. Или про модификаторы открытия файлов (или как их там зовут).



Отредактировано fata1ex (Июль 30, 2012 00:11:18)

Офлайн

#7 Июль 30, 2012 00:37:04

folkman
Зарегистрирован: 2012-07-29
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с получением PID процесса

fata1ex
Зачем вам вообще getpid? fork возвращает pid потомка, можно просто перед sys.exit делать вывод в файл.
Что-то я туплю. Можете пояснить на примере? Если вы предлагаете записать fpid в файл, то у меня это благополучно не получилось

Офлайн

#8 Июль 30, 2012 06:38:18

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Проблема с получением PID процесса

Пример всё тот же:

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)

fork возвращает отцу pid потомка, а сыну - 0. После форка оба процесса начинают выполнения со следующей строки. Стандартными условиями на if fork_return_value мы можем определить, где находимся, в родителе или в потомке.

Если нужен getpid:
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)

Офлайн

#9 Июль 30, 2012 10:30:27

folkman
Зарегистрирован: 2012-07-29
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с получением PID процесса

Сделал с использованием os.fork(), вроде теперь всегда возвращает нужный PID. Спасибо, что помогли разобраться.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version