0

我必须永远读取一个文件,例如系统启动时直到结束。基于文件事件,python 脚本必须采取行动。但奇怪的是我的 python 脚本没有这样做。

第 1 步:crontab 并在启动时我有以下内容

tail -f /var/tmp/event.log | python /var/tmp/event.py &

第 2 步:其他应用程序现在正在转储文件 /var/tmp/event.log 中的行,例如

java -cp Java.jar Main.main | tee -a /var/tmp/event.log

or

echo "tst" >> /var/tmp/event.log

or

otherapps | tee -a /var/tmp/event.log

第 3 步:python event.py 有一个循环来监听命令并执行,但这些执行没有发生

import sys, time, os
while True:
  line = sys.stdin.readline()
  if line:
    if "runme.sh" in line:
      os.system("/var/tmp/runme.sh")
    if "killfirefox.sh" in line:
      os.system("/var/tmp/killfirefox.sh")
    if "shotemail.sh" in line:
      os.system("/var/tmp/shotemail.sh")
    if "scan.sh" in line:
      os.system("/var/tmp/scan.sh")
    if "screenshot.sh" in line:
      os.system("/var/tmp/screenshot.sh")

  else:
    time.sleep(1)

我做错了什么?我已经验证了 event.log 文件每行都有正确的命令,甚至当我手动执行它时echo "runme.sh" | python /var/tmp/event.py它也可以工作,但为什么在使用引导时间/crontab 模式时不工作?

4

1 回答 1

1

可能是因为 tail 命令的输出被缓冲了。当您在 bash 中写入管道时,输出不会立即发送到另一个命令 - 它会被缓冲,然后再输出。例如,尝试ls -l | more在大目录上运行。more在输出列表之前,您会看到明显的延迟。

有很多方法可以解决这个问题。您可以像这样使用stdbuf(有关更多信息,请参见此处):

stdbuf -i0 -e0 -o0 tail -f /var/tmp/event.log | python /var/tmp/event.py

试试这个,看看它是否效果更好。一个更优雅的解决方案是使用一个临时文件,该文件仅在有要读取的输出时才被写入,然后由 python 脚本或命名管道监视。

于 2013-09-17T12:56:38.533 回答