Linux下远程读取日志产生多SSH连接进程的问题求解
解决远程日志同步多SSH进程问题
需求与当前实现
需求:读取远程服务器日志文件的最新更新内容,并追加到本地服务器的文件中。
已编写Shell脚本getMsgpka.sh:
sshpass -p '***' ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log | tee -a /var/opt/data/NOTIFICATION/log/MSGPKA/tester.DBG.log
使用nohup命令运行该脚本:
nohup sh /var/opt/script/getMsgpka.sh &
问题现象
运行后生成了多个SSH会话进程,执行ps -ef | grep msgpka输出如下:
[user1@knoc1 opt]$ ps -ef | grep msgpka user1 421 1 0 04:35 ? 00:00:00 sshpass -p zzzzzzzzzzz ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log user1 423 421 0 04:35 pts/110 00:00:00 ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log user1 576 1 0 Mar09 ? 00:00:00 sshpass -p zzzzzzzzzzz ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log user1 578 576 0 Mar09 pts/28 00:00:00 ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log user1 3798 1 0 Mar09 ? 00:00:00 sshpass -p zzzzzzzzzzz ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log user1 3800 3798 0 Mar09 pts/46 00:00:00 ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log user1 5468 1 0 Mar09 ? 00:00:00 sshpass -p zzzzzzzzzzz ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log user1 5470 5468 0 Mar09 pts/59 00:00:00 ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log user1 7543 1 0 04:45 ? 00:00:00 sshpass -p zzzzzzzzzzz ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log user1 7547 7543 0 04:45 pts/111 00:00:00 ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log user1 7686 1 0 06:35 ? 00:00:00 sshpass -p zzzzzzzzzzz ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log
解决方案
1. 清理现有多余进程
先终止所有相关的sshpass和ssh进程:
pkill -f "sshpass -p.*ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log"
2. 修改脚本添加单进程锁
修改getMsgpka.sh,加入文件锁机制,确保同一时间只有一个进程在运行:
#!/bin/bash # 定义锁文件路径 LOCK_FILE="/var/opt/script/getMsgpka.lock" # 检查锁文件是否存在,若存在则退出 if [ -f "$LOCK_FILE" ]; then echo "脚本已在运行,锁文件 $LOCK_FILE 存在" exit 1 fi # 创建锁文件,脚本退出时自动删除 trap 'rm -f "$LOCK_FILE"; exit' INT TERM EXIT touch "$LOCK_FILE" # 执行日志同步命令 sshpass -p '***' ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log | tee -a /var/opt/data/NOTIFICATION/log/MSGPKA/tester.DBG.log
3. 正确启动脚本
给脚本添加执行权限:
chmod +x /var/opt/script/getMsgpka.sh
然后用nohup启动,同时记录运行日志:
nohup /var/opt/script/getMsgpka.sh > /var/opt/script/getMsgpka.log 2>&1 &
额外优化建议
- 避免在脚本中明文写密码,改用SSH密钥认证更安全,且无需依赖
sshpass:- 在本地生成SSH密钥:
ssh-keygen -t rsa(一路回车使用默认配置) - 将公钥复制到远程服务器:
ssh-copy-id msgpka@10.9.7.66 - 修改脚本中的命令为:
ssh msgpka@10.9.7.66 tail -f /home/DBG/logs/tester.DBG.log | tee -a /var/opt/data/NOTIFICATION/log/MSGPKA/tester.DBG.log
- 在本地生成SSH密钥:
内容的提问来源于stack exchange,提问作者stacktesting
相关产品推荐
相关产品推荐

