Хотя это не самый эффективный метод, он должен работать. После вас CTRL + C ; В обработчике KeyboardInterrupt вы могли бы exec_command("killall -u %s tail" % uname)
примерно так:
#!/usr/bin/env python2
import paramiko
import select
import time
ltime = time.time()
# Or use random:
# import random
# ltime = random.randint(0, 500)
uname = "victorhooi"
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('someserver', username=uname, password='blahblah')
transport = client.get_transport()
channel = transport.open_session()
channel.exec_command("tail -%df /home/victorhooi/macbeth.txt" % ltime)
while True:
try:
rl, wl, xl = select.select([channel],[],[],0.0)
if len(rl) > 0:
# Must be stdout
print channel.recv(1024)
except KeyboardInterrupt:
print("Caught control-C")
channel.close()
try:
# open new socket and kill the proc..
client.get_transport().open_session().exec_command("kill -9 `ps -fu %s | grep 'tail -%df /home/victorhooi/macbeth.txt' | grep -v grep | awk '{print $2}'`" % (uname, ltime))
except:
pass
client.close()
exit(0)
Это уничтожит все открытые процессы с именем tail
. Однако это может вызвать проблемы, если у вас есть tail
открытых, которые вы не хотите закрывать, если в этом случае вы могли бы grep
a ps
, получить pid и kill -9
it.
Во-первых, задайте хвост для чтения n
строк от конца файла до следующего. присвойте n
уникальное число, например time.time()
, поскольку tail не заботится о том, что это число больше числа строк в файле, большое число из time.time()
не должно вызывать проблем и будет уникальным. Затем найдите этот уникальный номер в ps
:
client.get_transport().open_session().exec_command("kill -9 `ps -fu %s | grep 'tail -%df /home/victorhooi/macbeth.txt' | grep -v grep | awk '{print $2}'`" % (uname, ltime))