跳转到主要内容

Pidfile具有过时检测和文件锁定功能,也可以用作上下文管理器或装饰器

项目描述

https://travis-ci.org/trbs/pid.svg?branch=master https://coveralls.io/repos/trbs/pid/badge.png Latest PyPI version Number of PyPI downloads

PidFile类具有以下特性:

  • 过时检测

  • pidfile锁定(fcntl)

  • chmod(默认为0o644)

  • chown

  • 自定义异常

上下文管理器、守护进程和日志记录

PidFile可以用作上下文管理器

from pid import PidFile
import os

with PidFile('foo') as p:
  print(p.pidname) # -> 'foo'
  print(p.piddir) # -> '/var/run' But you can modify it when initialize PidFile.
  print(os.listdir('/var/run')) # -> ['foo.pid']

# pid file will delete after 'with' literal.

使用PidFile与守护进程上下文管理器(例如python-daemon)时,也可以将日志记录到文件。这要求在守护进程启动时小心处理打开的文件,以避免关闭它们,这会导致日志记录出现问题。特别是,应保留打开的处理程序

import sys
import logging
import logging.config

import daemon
from pid impor PidFile

logging.config.fileConfig(fname="logging.conf", disable_existing_loggers=False)
log = logging.getLogger(__name__)

PIDNAME = "/tmp/mydaemon.pid"

def get_logging_handles(logger):
    handles = []
    for handler in logger.handlers:
        handles.append(handler.stream.fileno())
    if logger.parent:
        handles += get_logging_handles(logger.parent)
    return handles

def daemonize():
  file_preserve = get_logging_handles(logging.root)
  pid_file = PidFile(pidname=PIDNAME)

  with daemon.DaemonContext(stdout=sys.stdout,
                            stderr=sys.stderr,
                            stdin=sys.stdin,
                            pidfile=_pid_file,
                            files_preserve=files_preserve):

    run_daemon_job()
  print("DONE!")

if __name__ == "__main__":
  daemonize()

这假设已经创建了一个logging.conf文件,有关日志记录的基本教程,请参阅基本教程

装饰器

PidFile也可以用作装饰器

from pid.decorator import pidfile

@pidfile()
def main():
  pass

if __name__ == "__main__":
  main()

异常顺序

在默认模式下,PidFile会在做其他任何事情之前尝试获取文件锁。这意味着,在运行程序两次时,您通常会得到PidFileAlreadyLockedError而不是PidFileAlreadyRunningError。

如果您只想知道程序是否正在运行,最简单的方法是捕获PidFileError,因为它将捕获所有可能的PidFile异常。

行为

从版本2.0.0开始的变化

  • 现在 pid 与守护进程上下文管理器(如 python-daemon)友好地协同工作,其中 PidFile 上下文管理器作为参数传递。新的修正行为将确保在获取/检查锁时确定进程环境。先前行为会在实例化类时确定进程环境,这可能导致在实例化 PidFile 后进行进程分叉时 PID 的错误确定。

  • 终止时的 pidfile 清理使用 atexit 模块完成。默认的 SIGTERM 处理程序无法干净地退出,因此注册到 atexit 的函数将不会执行。一个触发 atexit 注册的清理函数的自定义处理程序将覆盖默认的 SIGTERM 处理程序。如果已配置先前的信号处理程序,则不会覆盖它。

项目详细信息


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码发行版

pid-3.0.4.tar.gz (16.2 kB 查看哈希)

上传时间 源代码

构建发行版

pid-3.0.4-py2.py3-none-any.whl (12.0 kB 查看哈希)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面