1

我使用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 中向 shell 用户提供更新,例如以非侵入方式将天气更新打印到控制台。如果有更好的方法来实现这一点,请告诉我。但目的是在终端内显示信息(而不是通过,比如说,Growl 通知),而不会阻塞。

4

4 回答 4

2

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

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

更新:

man write
man wall

http://linux.die.net/man/1/write , http://linux.die.net/man/1/wall

于 2012-05-07T14:33:21.603 回答
2

写入守护程序的日志文件可能是最佳实践。但是你能不能不写信给 stderr 并通过交织线获得上述所需的行为?

于 2012-05-07T14:44:01.233 回答
2

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

“普通用户”shell 提示的 shell 变量是PS1,所以谷歌搜索bash PS1orbash prompt customisation会得到一些有趣的例子。

这里有一些链接:

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

于 2012-05-07T14:53:26.833 回答
1

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

请参阅有关日志记录的文档 - 链接

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')
于 2012-05-07T15:35:44.193 回答