从Python守护进程到尽力打印到stdout

时间:2012-05-07 14:28:29

标签: python python-daemon

我使用python-daemon编写了一个简单的脚本,打印到sys.stdout

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import daemon
import sys
import time


def main():
    with daemon.DaemonContext(stdout=sys.stdout):
        while True:
            print "matt daemon!!"
            time.sleep(3)


if __name__ == '__main__':
    main()

脚本按照我的意愿工作,除了一个主要缺陷 - 当我在我的shell中输入时它会中断我的输入:

(daemon)modocache $ git clomatt daemon!!
matt daemon!!ne
matt daemon!! https://github.com/schacon/cowsay.git
(daemon)modocache $ 

输出是否有任何方式以非侵入方式显示?我希望有类似的东西:

(daemon)modocache $ git clo
matt daemon!! # <- displayed on new line
(daemon)modocache $ git clo # <- what I had typed so far is displayed on a new line

如果这是一个愚蠢的问题,请原谅我,我对贝壳的工作方式不太熟悉。

编辑:澄清

我希望此脚本运行守护程序的原因是我想在shell中为shell用户提供更新,例如以非侵入方式打印控制台的天气更新。如果有更好的方法来实现这一目标,请告诉我。但目的是在终端内显示信息(不是通过,例如,Growl通知),而不会阻塞。

4 个答案:

答案 0 :(得分:2)

守护进程按定义应该在后台运行。因此它应该写入日志文件。

因此,要么将其输出重定向到日志文件(shell重定向或将其移交给某些sys日志记录守护程序),要么将其写入python代码中的日志文件。

更新

man write
man wall

http://linux.die.net/man/1/writehttp://linux.die.net/man/1/wall

答案 1 :(得分:2)

最好的做法是写入守护程序的日志文件。但是你能不写给stderr并且在编织线上有上面所希望的行为吗?

答案 2 :(得分:2)

如果它不需要是“即时”通知,并且您可以等到下次用户运行命令,您可以将所有类型的内容烘焙到bash shell提示符中。我告诉我例如我所在目录的时间和git存储库状态。

“普通用户”shell提示的shell变量为PS1,因此Google bash PS1bash prompt customisation的Google搜索会为您提供一些有趣的示例。

以下是一些链接:

通常,您可以在提示字符串中包含任意脚本的输出。但请注意,高延迟命令会延迟打印提示字符串,直到可以对其进行评估,因此缓存信息可能是个好主意。 (例如,如果要显示天气网站的天气,请不要在每次显示提示时都出现bash提示并检索网页!)

答案 3 :(得分:1)

查看 日志记录 库(标准库的一部分)。这可以将调试和运行时数据路由到控制台或文件(或任何地方),具体取决于系统的状态。
它提供了几种日志设施,例如错误,调试,信息。每个都可以配置不同。

See documentation on logging - link

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')