2

私は次の Python スクリプトを持っています。

  • less はオプション -F で開きます。これは、Tail のようにファイルに従います。
  • ファイルを検査 (移動) するには、ユーザーは ctrl + c で割り込みを送信する必要があります。
  • ctrl +c (割り込み) を送信すると、Python スクリプトに送信され、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!")
4

1 に答える 1

1

シグナルを無視して、 less オプションSIGINTを削除してみてください。-K

#!/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独自のシグナルハンドラーをセットアップし、おそらくこれが機能する理由です。

于 2014-07-22T11:12:36.447 に答える