![ssh -n machine.com 'tail -f file' 一段时间后停止工作](https://linux22.com/image/1398858/ssh%20-n%20machine.com%20'tail%20-f%20file'%20%E4%B8%80%E6%AE%B5%E6%97%B6%E9%97%B4%E5%90%8E%E5%81%9C%E6%AD%A2%E5%B7%A5%E4%BD%9C.png)
我在远程服务器上有一个日志文件,我需要tail -f
通过 将其复制到本地机器上ssh
。该命令非常简单:
ssh -n [email protected] 'tail -f /path/to/remote/file'
最初它运行得很好,但过了一段时间(可能是 1-3 小时)它就停止工作了:远程日志文件中有新行,但在本地机器上并没有更新。没有错误回显,它只是停止工作。我必须按Ctrl+来中断它C并重新启动相同的命令,然后它又开始工作了一段时间。
互联网连接 100% 正常工作,因为我同时与同一个远程服务器进行了交互式 SSH 会话,并且它始终保持正常工作。
可能存在什么问题?如何解决?
以防万一,我想说一下我想要实现的目标:这只是关于远程 irssi 通知。我有一台服务器,irssi 始终在 tmux 会话中运行,我想在我的桌面上接收通知。这样重要的事件(start_notification/stop_notification)就会写入日志文件,我的本地脚本会读取此日志并管理通知(托盘图标、声音、libnotify 的事件)
而且,正如我已经说过的,它会在一段时间后停止工作,直到我重新启动它。
我的桌面操作系统是 Linux Mint 13 MATE,服务器操作系统是 Debian 3.2.51-1
任何帮助均感激不尽。
答案1
你应该检查
/etc/ssh/sshd_config
文件在您的服务器上,它应该启用以下选项:
TCPKeepAlive yes
ClientAliveInterval 60
或者在打开连接时在 ssh 命令中使用以下选项:
ssh -o TCPKeepAlive=no -o ServerAliveInterval=60
另一个选择是通过运行以下命令来保留某些操作:
sh -c 'while echo "Still Active" ; do sleep 20 ; done'&
您也可以将其放入您的登录脚本中,这样您就不需要手动输入了。
答案2
ssh -o TCPKeepAlive=yes -o ClientAliveInterval=60
ClientAliveInterval
用于服务器端,即它仅适用于 sshd。
相反,使用:
ssh -o TCPKeepAlive=yes -o ServerAliveInterval=60
另请考虑:
ServerAliveCountMax
这是一个很好的参考: https://unix.stackexchange.com/questions/34004/how-does-tcp-keepalive-work-in-ssh
答案3
这是一个具有附带优势的简单解决方案(我让你猜):
ssh -n [email protected] 'while : ; do
date "+-- %H:%M:%S --"
sleep 20
done &
tail -f /path/to/remote/file'