虽然不是最有效的方法,但这应该有效 . 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 它 .
首先,设置tail以从文件末尾读取 n 行,然后再执行 . 将 n 设置为一个独特的nuber,如 time.time() ,因为尾部不关心该数字是否大于文件中的行数, time.time() 中的大数字不应该导致问题并且将是唯一的 . 然后grep为 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))