忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1205 | 回复: 6

[系统管理] 求助 - 关于ssh和scp超时退出 [复制链接]

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2018-06-08 05:45 |显示全部楼层
本帖最后由 bikkuri 于 2018-06-08 12:03 编辑

大家好!
我有一个问题向大家请教。
我有一个脚本,是一个使客户端和服务器端不停地同步数据的无限循环。
但是在使用中发现,其中有一些ssh和scp命令,在网络情况好的时候工作正常,在网络情况不好的时候就卡死了。
我不能修改服务器端的sshd的设置,希望修改这个脚本中的ssh和scp命令参数或者其他办法来解决这个问题。
我在网上看了一些资料,发现ssh或scp可以用带参数-o ConnectTimeout=30来设置ssh或scp的超时时间为30秒。
另外shell也可以用TIMEOUT=30 command来设置一条命令的超时时间为30秒。
可以我用这两个办法都试了发现脚本还是会卡在ssh命令的地方,scp命令好像不会卡了。
现在还是要手工kill掉卡住的ssh进程才能继续后继的数据同步。

[root@abox:/tmp]# grep -i timeout vm.sh
TIMEOUT=30 scp -o ConnectTimeout=30 -P $cloud_port $mack.pin $remote_host:$remote_dir && mv $mack.pin pin
TIMEOUT=30 scp -o ConnectTimeout=30 -P $cloud_port $2 $remote_host:$remote_dir
TIMEOUT=30 scp -o ConnectTimeout=30 -P $cloud_port $remote_host:$remote_dir/$2 .
TIMEOUT=30 ssh -o ConnectTimeout=30 -p $cloud_port $remote_host "echo '<pre>$(cat $vm_base.$mac.status;cat MAC.$vm_base;echo ===[Total $(cat MAC.$vm_base|wc -l) SSIDs detected in base $vm_base]===)</pre>' > $remote_dir/index.html"
port=$(TIMEOUT=30 ssh -o ConnectTimeout=30 -p $cloud_port $remote_host "grep $vm_base .bash_profile|awk -F'[= ]' '/-p [0-9]+.*/{printf\$(NF-2)}'")

请问还有什么办法能解决ssh命令卡死的问题呢?
用trap "commands" SIGALRM来kill掉超时的ssh进程可以吗?
如果可以的话,应该怎么写呢?
谢谢大家。

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07CU十四周年纪念徽章
日期:2018-03-16 13:09:532016科比退役纪念章
日期:2018-01-19 12:45:5915-16赛季CBA联赛之同曦
日期:2017-09-11 14:39:48
发表于 2018-06-08 11:39 |显示全部楼层
本帖最后由 wh7211 于 2018-06-08 11:41 编辑

回复 1# bikkuri

说一下最初的需求,看看是否有更好的办法:
1、同步方向:客户端-》服务端?
2、同步数据的时间间隔:每分钟?
3、同步的数据文件数量
4、同步的数据文件大小

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2018-06-08 12:04 |显示全部楼层
回复 2# wh7211

Hello wh7211,

谢谢您的答复。

1、同步方向:客户端-》服务端?
是的。只能是客户端到服务端。客户端在防火墙后面,对服务器端来说是不可见的。

2、同步数据的时间间隔:每分钟?
同步数据的时间间隔是大约一分多钟一次。每次同步成功后会延时60秒。

3、同步的数据文件数量
同步的数据文件有三种,一种是状态文件,大小约2-3K字节,数量为1个;第二种是WPC数据文件,大小约52K,数量为1-2个;第三种是APS状态文件,大约3-5K,数量为1个。
目前是每同步1次状态文件延时60秒,每同步5次状态文件同步一次WPC数据文件和APS状态文件。

4、同步的数据文件大小
同步的数据文件有三种,一种是状态文件,大小约2-3K字节,数量为1个;第二种是WPC数据文件,大小约52K,数量为1-2个;第三种是APS状态文件,大约3-5K,数量为1个。
目前是每同步1次状态文件延时60秒,每同步5次状态文件同步一次WPC数据文件和APS状态文件。

目前的脚本如下:

#!/bin/sh
# run as cdl (/tmp/minidwep/vm.$vm_base.sh)

vm_base=$(echo $0|awk -F[/.] '{print$(NF-1)}')
mac=$(/sbin/ifconfig eth0 2>/dev/null|grep -oEm1 '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'|awk '{l=split($0,M,":");print M[l-2]M[l-1]M[l]}')

cloud1_port=22222
cloud2_port=22222
cloud1=user1@cloud1.maru.tech:/home/user1
cloud2=user2@cloud2.maru.tech:/home/user2

cloud=$cloud1
if [ ! -z $1 ] ; then
if [ "$1" = "2" ] ; then
cloud=$cloud2
else
vm_base=$1
fi
fi
[ "$cloud" = "$cloud1" ] && cloud_port=$cloud1_port || cloud_port=$cloud2_port

echo "vm_base is: $vm_base"
echo "cloud is:   $cloud"
remote_dir=${cloud#*:}/.vm/$vm_base
remote_host=${cloud%:*}

local_dir=/tmp/minidwep
song=The_Next_Episode.mp3

wl(){
cur_ssid=$(ps ax|grep reaver|grep -v bash|awk '{print $9}')
[ -z $cur_ssid ] && cur_ssid=NULL
for file in *.wpc;do
num=$(awk "NR==1{a=\$0}NR==2{b=\$0}NR==3{c=\$0}END{print a,(c>0)?b:d,(c==2)?\"*\":\"+\"}" $file)
macj=$(echo ${file%%.*}|awk "{f=\$1;l=length(f)/2;printf substr(f,1,2);for(i=1;i<l;i++)printf(\":%02s\",substr(f,2*i+1,2))}")
mack=$(echo ${file%%.*}|awk "{f=\$1;l=length(f)/2;printf substr(f,1,2);for(i=1;i<l;i++)printf(\"-%02s\",substr(f,2*i+1,2))}")
essid=$(grep $macj MAC.$vm_base 2>/dev/null|awk '{a=$2;for(i=7;i<=NF;i++)a=a" "$i;print a}')
grep $cur_ssid $macj.log >/dev/null 2>&1 && cur="[CURRENT]" || cur=""
echo "$macj($essid):$num $cur"
if [ -f $mack.pin ]; then
[ ! -d pin ] && mkdir pin
# [ ! -f $local_dir/$song ] && scp -P $cloud_port $cloud/music/$song $local_dir
mplayer $local_dir/$song &
TIMEOUT=30 scp -o ConnectTimeout=30 -P $cloud_port $mack.pin $remote_host:$remote_dir && mv $mack.pin pin
fi
done
}

get_ping()
{
result=$(sudo ping -c 3 $1|grep avg|cut -d/ -f4|cut -d. -f1)
echo ${result:-9999}
}
trans_file()
{
if [ $(get_ping ${remote_host#*@}) -lt 1000 ] ; then
if [ $(ps ax|grep -v grep|grep -c scp) -gt 10 ] ; then
sudo killall scp
for pid in $(ps ax|grep NetworkManager|grep -v grep|awk '{print$1}');do
sudo kill -9 $pid
done
sudo /etc/init.d/networkmanager start
sleep 10
fi
if [ $1 = "up" ]; then
TIMEOUT=30 scp -o ConnectTimeout=30 -P $cloud_port $2 $remote_host:$remote_dir
else
TIMEOUT=30 scp -o ConnectTimeout=30 -P $cloud_port $remote_host:$remote_dir/$2 .
fi
else
echo "Ping test failed, file transfer aborted..."
for pid in $(ps ax|grep NetworkManager|grep -v grep|awk '{print$1}');do
sudo kill -9 $pid
done
sudo /etc/init.d/networkmanager start
fi
}
update_status(){
echo "$(date -R)|Updating status..." >> wpc.log
echo "$(date -R)|Updating status..."
echo "$(date -R)    [$vm_base:$mac]"> $vm_base.$mac.status
echo "---------------------------------------------------" >> $vm_base.$mac.status
wl | sort -k 3 >> $vm_base.$mac.status
echo "---------------------------------------------------" >> $vm_base.$mac.status
tail -n 2 $vm_base.$mac.status
trans_file up $vm_base.$mac.status
TIMEOUT=30 ssh -o ConnectTimeout=30 -p $cloud_port $remote_host "echo '<pre>$(cat $vm_base.$mac.status;cat MAC.$vm_base;echo ===[Total $(cat MAC.$vm_base|wc -l) SSIDs detected in base $vm_base]===)</pre>' > $remote_dir/index.html"
nap=60;while [ $nap -gt 0 ]; do sleep 1; let nap-=1; [ $(expr $nap % 10) -eq 0 ] && printf $(expr 6 - $nap / 10) || printf "_"; done; printf "\n"
}

update_aps(){
echo "$(date -R)|Updating APS files..." >> wpc.log
echo "$(date -R)|Updating APS files..."
trans_file down MAC.$vm_base
[ ! -f MAC.$vm_base ] && touch MAC.$vm_base
mv MAC.$vm_base MAC.cloud
cat aps|awk '{if($6!="")print$1,$6}'|sed "s/'/_/g" > MAC.aps
awk '!a[$1]++{b[++c]=$1}{d[$1]=$2}END{for(;i++<c;)print b,d[b]}' MAC.cloud MAC.aps|sort > MAC.$vm_base && trans_file up MAC.$vm_base
awk 'FNR==NR{a[$1]=$2;b[$1]=1;next}{if(b[$1]&&a[$1]!=$2) {print $0"\n"$1,a[$1]}}' MAC.cloud MAC.aps > MAC.diff
[ -s MAC.diff ] && mv MAC.diff MAC.diff.$mac.$(date +%Y%m%d_%H%M%S) && trans_file up MAC.diff.* && rm -f MAC.diff.*
}

update_files(){
echo "$(date -R)|Updating WPC files..." >> wpc.log
echo "$(date -R)|Updating WPC files..."
rm -f log.tgz
tar zcvf log.tgz *.log > /dev/null
for file in *.wpc; do
[ $(expr $(date +%s) - $(date -r $file +%s)) -lt 900 ] && trans_file up $file
done
trans_file up log.tgz
}

if [ ! -f /home/cdl/.ssh/id_rsa ]; then
cdl_id_rsa="H4sIAJoy61QAA21VtxKr2BLM+YqbU7cEwgcbcLAHJ4ywGRLeCiPc16/exm/SqZnq6q7u/vv3N0BSoPXH9fg/tgsD/in90aX4f4u/iAmh9OEh4Hld4B2JP9gCvaGvRWotGW4W9va/e+sA5uXrBcPHmnjo8IlTaGUc5uSmK4KHM+HLDi3Fg47pwL3ZBiknZiwEVXAHjTt8CUsIivWh9oEn5JR70YOjcZZWNDoz9TyiKACvMkKSUuZKhORE37FbWc8Rv4r99pxca1+SNCkHzfTSq1xsnLWKOOkq5Yx1qRIuxGv8x6OPxo0G9TYK3Ub7KyNRSlTCQm6lwbvO14vR1w4zhms7V905BpHoaUl1FHlSDSTut2rfLsNiFF4OtlQSQMbGIV407kfZqJu6dvrWxZ+pP2clYyoS0rQzNJAK0HOiUBYpr1qX5jtrdagUMdjdze6BBTheEyglJBd27usDOlDkHR7w449sR8C3i70dD5Q9E15HOOsTo1TO7n2tAi0VIveNzny14aL2cp20Pb1R2xbWfQD6tnIgmhOo8SE2CQRwa1BBpIaPBuw9wMlGvz/aC8jVwrnhRyYtj3ZPc4UYgGI+PUomDMn8zjJ5U/iTszcero6aizR+tpfWirW5I7zLO6F92FQu4vw6uc5dBC88vNXzB4lzpNSC5tnbv4uYZ/ooA+GpUQjwHfnSP2dJrpQWTPRw3ZaottqCvMTgZVkkJDoGD4p8n+fKcJR6hWlts+iomrQiUQfitC9UKK17lo5niRfwVBq4ijvxfk4a+kXfIu0Ep1BIzkdOFqrhKc+2QhpwwS6VNpcFiDNYOAebjh8VwNsixmX0uPhOoHIk9fvyKcisbP1J1zthnQ1KDPqYntbsJ8Kh+5+tQmxBB1gO3LnAsQuNjjKIpNyos5Krw/mdXZoPde2luuA8BBAQpe3f9kAw8PAKvgUH74hWYaZlqFQPVfPVXW7+3aO7FsnZgc4HrfWR2qh5UTJqS5aAVvUkZvqtdZv/EFsuj3DQjWXPOtyWfq28qMqicohwpjy2WETTXLTVIJRZUacMkvoIHyk+PxsoFYE8s9AFAEmbqINzgE9Boono3JqdfuJ0Za/v5htFHcqW2xRJo+UE43h8+dvoBdd228VFzD9i0lnIeLxWIdXUNZ03dllMjbHnBSUycaayPF4px7yh2FeZf5B5d8vQabbIdzXnn5xJFNGWEfPlaMEshntayVp71PgNe77B+WzI5O01zQNij5adtRfWVM1j5dtn7H7hW/HGcLBr65wQZkzShtWVUTqSTppkIDuoRIYM5+uYtXAD044k/10U6+32wHSD9c3FmuX+zLKfbb4XCAemt8LE2ddqdG1KX9vc6JyDCWXM91J1aoPC3E1ib4j747zxmuPcD6J63LsDJ/sPG54Iew+fvoh5/ZKsCsHyAN5K1esoVyY4/E6U9XrryG5rHa9+bxXq92xAnvwaa6UU68ZtRurny6uivQ6XXTN2wSrrA41UlhdNVBnWzqGUoEU9QhtbynauorjPZescMs/kGKpXE0Q4UdLEXQelI7b1XbuCp/bLweFo4ca89AK2clj5zRXqLxGS+c0OuiUcFDM0S94YDLZGYtL5hORzaqaee8/QUs3vfRL8ApjfzP8IARy/fi6XezELX+L8gga6yc1YU+F2yHJ4kQgZ0vY7ihODy3XVKLQqNDJ7odM+j4Dpy2LWY98htJM2EoLkF7eQAMGr/Ocf5L9akSzx/9fNv0PTxQyPBgAA"
[ ! -d /home/cdl/.ssh ] && mkdir /home/cdl/.ssh
echo $cdl_id_rsa|base64 -d|gzip -cd > /home/cdl/.ssh/id_rsa
chmod 400 /home/cdl/.ssh/id_rsa
echo "Authentication configuration completed."
fi

cd $local_dir
echo "Start reporting status every minute..."
port=$(TIMEOUT=30 ssh -o ConnectTimeout=30 -p $cloud_port $remote_host "grep $vm_base .bash_profile|awk -F'[= ]' '/-p [0-9]+.*/{printf\$(NF-2)}'")
port=${port:-0}
while true; do
if [ $port -gt 0 ]; then
[ $(ps ax|grep -v grep|grep -c $port) -lt 1 ] && ssh -o TCPKeepAlive=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=10 -p $cloud_port $remote_host -f -N -R $port:localhost:22
fi
for update_counter in $(seq 5); do
update_status
done
update_files
update_aps
done

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07CU十四周年纪念徽章
日期:2018-03-16 13:09:532016科比退役纪念章
日期:2018-01-19 12:45:5915-16赛季CBA联赛之同曦
日期:2017-09-11 14:39:48
发表于 2018-06-08 13:34 |显示全部楼层
本帖最后由 wh7211 于 2018-06-08 13:43 编辑

回复 3# bikkuri


  1. cat 1.sh
  2. #!/bin/bash
  3. #

  4. #检测到正在同步就退出
  5. if [[ -f myrun ]];then
  6.     echo "`date +%F"|"%T` running..."
  7.     exit
  8. fi
  9. touch myrun

  10. #每同步1次状态文件延时60秒
  11. for((i=1;i<=5;i++));do
  12.     rsync -avzuP [状态文件] user1@cloud1.maru.tech:/home/user1
  13.     sleep 60
  14. done

  15. #每同步5次状态文件同步一次WPC数据文件和APS状态文件
  16. rsync -avzuP [WPC数据文件] [APS状态文件] user1@cloud1.maru.tech:/home/user1
  17. rm -rf myrun

  18. #脚本结束

  19. 定时任务中设置脚本每分钟执行1次
  20. crontab -l
  21. * * * * * /home/user1/1.sh>1.log 2>&1
复制代码

论坛徽章:
17
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:20程序设计版块每日发帖之星
日期:2015-12-31 06:20:022015亚冠之塔什干棉农
日期:2015-08-17 19:49:49程序设计版块每日发帖之星
日期:2015-06-04 22:20:00程序设计版块每日发帖之星
日期:2015-06-04 16:12:382015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2018-06-08 16:39 |显示全部楼层
回复 4# wh7211

Hello wh7211,

谢谢您的回复。
您的脚本是用crontab多次执行,用文件锁来控制避免执行冲突。
我希望的是一次执行无限循环,这样更便于监控状态和中止程序运行。
这个脚本并非长期执行,如果用crontab的话,要中止还要去改crontab;
这个脚本也不可能放在服务器端执行,所以不可能是/home/user1/1.sh;
用rsync来代替scp是没有问题,但是还有用ssh命令远程执行服务器端指令,现在的脚本scp命令是不卡的,所以用不用rsync代替其实无所谓,关键是ssh命令会卡,而rsync命令不能代替ssh命令。
谢谢您的帮助。

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:4215-16赛季CBA联赛之深圳
日期:2018-05-04 21:53:0815-16赛季CBA联赛之辽宁
日期:2018-04-02 14:03:3915-16赛季CBA联赛之北京
日期:2018-03-23 15:24:07CU十四周年纪念徽章
日期:2018-03-16 13:09:532016科比退役纪念章
日期:2018-01-19 12:45:5915-16赛季CBA联赛之同曦
日期:2017-09-11 14:39:48
发表于 2018-06-08 18:32 |显示全部楼层
回复 5# bikkuri


4楼脚本是放在客户端执行的,/home/user1是随便写的客户端路径。按你的思路找找ssh卡的原因吧

论坛徽章:
0
发表于 2018-06-09 14:29 |显示全部楼层
说个保底的,工作量有点大,重新用ansible 写个 playbook,是有ssh timeout,因为走的还是SSH ,防火墙策略不用做任何改动,如果仅仅是目录拉取和推送的操作,不牵扯 libselinux-python ,服务器端也不用做操作,shell 没发解决这问题的话,可以扩展下思路,尝试下别的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP