【问题标题】:Python shell script open less with +F optionPython shell 脚本使用 +F 选项打开更少
【发布时间】:2014-09-13 02:17:09
【问题描述】:

我有以下 Python 脚本,似乎都可以按照我的意愿工作,除了以下内容:

  • less 使用选项 -F 打开,这将像 Tail 一样跟随文件。
  • 检查(移动)用户必须按 ctrl + c 发送中断的文件。
  • 当发送 ctrl +c(中断)时,这将被发送到 python 脚本,这将终止 less 进程。

有没有办法可以在 less 窗口中使用 ctrl +c 并且在执行此操作时不终止脚本?

#!/usr/bin/python
import sys
import os
import subprocess as sp
try:
    if(len(sys.argv) < 2):
        print "Choose an EngineID!"
    engineID = sys.argv[1]

    logdir='/data/work/silverlocal-%s/log' % engineID
    logfiles = sorted([ f for f in os.listdir(logdir) if f.startswith('log-%s' % engineID)])
    lastlog = (logdir + "/" + logfiles[-1])

    os.spawnlpe(os.P_WAIT, 'less', 'less', '+F', '-K', (lastlog), os.environ)

except KeyboardInterrupt:
    pass

如果使用我当前的脚本没有一个很好的解决方案,也许有人可以建议我一个更合适的解决方案,语言并不重要。

干杯,

菲利普

解决方案:

#!/usr/bin/python
import sys
import os
import subprocess as sp
import signal

if(len(sys.argv) < 2):
print "Choose an EngineID!"
engineID = sys.argv[1]

logdir='/data/awork/silverlocal-%s/log' % engineID
logfiles = sorted([ f for f in os.listdir(logdir) if f.startswith('log-%s' % engineID)])
lastlog = (logdir + "/" + logfiles[-1])
old_action = signal.signal(signal.SIGINT, signal.SIG_IGN)
os.spawnlpe(os.P_WAIT, 'less', 'less', '+F', (lastlog), os.environ)
signal.signal(signal.SIGINT, old_action)    # restore old signal disposition
print("I'm still running!")

【问题讨论】:

  • 在新的选项卡/窗口中打开它,重点是运行 python 脚本的位置
  • 您可能应该使用subprocess 而不是os 来启动进程。它使诸如杀死进程之类的事情变得更加容易
  • 您好,我其实并不想杀死进程,我想将中断信号发送给less,而不是Python脚本
  • Padraic Cunningham,您的意思是打开一个新的终端选项卡吗?这不是一个真正的选择,因为用户也将使用 Putty 启动此脚本,还是我误解了您的评论?

标签: python linux scripting less-unix


【解决方案1】:

您可以尝试忽略SIGINT 信号并删除-K less 选项:

#!/usr/bin/python
import sys
import os
import signal
import subprocess as sp

try:
    if(len(sys.argv) < 2):
        print "Choose an EngineID!"
    engineID = sys.argv[1]

    logdir='/data/work/silverlocal-%s/log' % engineID
    logfiles = sorted([ f for f in os.listdir(logdir) if f.startswith('log-%s' % engineID)])
    lastlog = (logdir + "/" + logfiles[-1])

    old_action = signal.signal(signal.SIGINT, signal.SIG_IGN)
    os.spawnlpe(os.P_WAIT, 'less', 'less', '+F', (lastlog), os.environ)
    signal.signal(signal.SIGINT, old_action)    # restore old signal disposition
except KeyboardInterrupt:
    pass

print("I'm still running!")

try...except 不再有用,因此您可以删除它。

老实说,我对信号处理的回忆有点模糊,我不能 100% 确定这为什么有效。显然,忽略 SIGINT(由 Ctrl+C 生成)会阻止 Python 对信号采取行动,但生成的进程应该继承它父进程的信号处置。可能less 设置了自己的信号处理程序,也许这就是它起作用的原因。

【讨论】:

  • 嘿 mhawke,感谢您的回复和回答,它就像一个魅力。非常感激!我将编辑我的问题以包含您提出的解决方案。
  • @PhillipParrin 太好了。如果有任何意外的副作用,请告诉我。
  • 好的,现在它正在做我需要的。在 ctrl+c 时不关闭 spawn less 进程。再次非常感谢!
猜你喜欢
  • 2023-04-04
  • 2018-04-17
  • 2012-10-09
  • 2012-09-21
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
相关资源
最近更新 更多