Little Tools: Killtree & Ssh_auto
终于写完了一个复杂的流程,流程里面一环套一环。于是乎,很兴奋的开始后台运行,然后在流程的中间文件有个错误之前没有发现。接下来的事情相信很多在非 Windows 环境下作开发的朋友都会遇到的闹心事情:
先用
pstree -ap
获取了所有进程的情况(下面是节选了其中一部分)
sh,19058 -c cd\\040/search/for_cacti/script;\\040sh\\040time.sh\\040../conf/cpc_performance.conf\\0401>>../log/perf.log\\0402>&1
`-sh,19067 time.sh ../conf/cpc_performance.conf
`-sh,19134 time.sh ../conf/cpc_performance.conf
|-awk,19138 -F\\t -v check_time=20110509\\04015:30:01...
`-rclog,19135 /opt/rclog/rclog -s contextserver --local --cat -l ie_log --last=5当然上面这个进程树,无论是深度还是广度已经算少了,有时候多的能烦死人。
然后很郁闷的,从父到子一个一个的 kill。
kill -9 19058; kill -9 19067; kill -9 19134; kill -9 19138; kill -9 19135;
刚开始的时候,我总是可以耐心地这么一个一个的 kill ,但是时间久了,我就完全不能忍了,这也太崩溃了!为了发扬一下 IT 民工的 DIY 精神,我只得写了一个小脚本 killtree.sh 来帮我处理这个繁琐的过程。
# Author: Bill Wung
# url: http://www.iron-feet.com
pidkill=$1
pidlist=` ps -eo ppid,pid | sed 1d | awk \'{ if( $1!= $2 ) print $1"\\t"$2 }\' | sort | uniq `
set -u
killpid()
{
set -x
kill -9 "$1"
set +x
for subpid in ` echo "$pidlist" | awk -F"\\t" \'{ if( $1==\'"$1"\' ) print $2 }\' `
do
killpid "$subpid"
done
}
killpid "$pidkill"以上面列举的进程情况为例,你只需要执行一下
sh killtree.sh 19058
就 OK 了
你需要对服务器做一些操作,并且这个操作是需要每天做一次的。如果做成每日流程放入 crontab 那该多好呀。
可是无情的 OP 和我说:“这台机子不允许非 OP 搭建每日流程,也不允许 OP 以外的人为该机器建立 ssh 的信任关系。”
我顿时崩溃
。
我完全没法忍受,每天同一时间去手动地跑一个任务,太土鳖了!于是找了一下,发现了一个叫 expect 的东东!
根据 Linux Man Page ,expect 自动自动实现人机交互的操作,例如:输入密码、敲个 yes 什么的。
Expect is a program that “talks” to other interactive programs according to a script. Following the script, Expect knows what can be expected from a program and what the correct response should be. An interpreted language provides branching and high-level control structures to direct the dialogue. In addition, the user can take control and interact directly when desired, afterward returning control to the script.
大致了解了一下 expect 的语法,写了一个小脚本 ssh_auto.expect 来解决自动登录和发送命令的问题。
# Author: Bill Wung
# url: http://www.iron-feet.com
set host [lindex $argv 0]
set cmd [lindex $argv 1]
set usr [lindex $argv 2]
set psw [lindex $argv 3]
spawn ssh "$usr@$host" "$cmd"
set timeout 5
expect {
"(yes/no)" {
send "yes\\r";
exp_continue
}
}
set timeout 5
expect {
"id_rsa\'" {
send "\\r";
exp_continue
}
}
set timeout 5
expect {
"Password:" {
send "$psw\\r";
exp_continue
}
}
set timeout 5
expect {
"password:" {
send "$psw\\r";
exp_continue
}
}
exit由于该脚本是 expect 的脚本,所以执行的时候需要用 expect 调用。
expect ssh_auto.expect 10.10.10.10 "cd /aa/bb; sh cc.sh; " root rootpassword # 第一个参数是目标IP 第二个参数是执行的命令 第三个参数是用户名 第四个就是密码了
由于很多 Linux 的发行版都不自带 expect ,所以部分用户需要自行安装一下 expect 才能调用该脚本。
以上两个脚本,只是我平时使用,并考虑到太多的需求。
我会在 Google Code 开一个项目,将我平时随手写的一些小脚本扔进去。各位如果觉得有用的话,可以使用;如果有什么建议的话,更是不吝赐教。
项目的地址是 http://code.google.com/p/iron-feet-tools/ ,目前里面就两个脚本以后会越来越多的。
项目前几天刚建立, wiki 啊什么的改天再完善吧!
建议继续学习:
- Linux shell脚本使用while循环执行ssh的注意事项 (阅读:7611)
- 在ssh服务里使用chroot (阅读:5512)
- 为什么要用公钥/私钥而不是密码去做SSH身份验证 (阅读:5381)
- 如何让ssh登录更加安全 (阅读:5224)
- ssh连接超时解决办法 (阅读:5171)
- 懒人连ssh不输密码若干大法 (阅读:5132)
- SSH无密码登录 (阅读:5110)
- ssh命令 (阅读:4881)
- 共享会话的ssh连接配置 (阅读:4309)
- SSH下连接Oracle的方法 (阅读:4200)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Iron_Feet 来源: 风云阁
- 标签: Killtree ssh
- 发布时间:2011-09-25 13:49:26
-
[884] WordPress插件开发 -- 在插件使用 -
[136] 解决 nginx 反向代理网页首尾出现神秘字 -
[57] 整理了一份招PHP高级工程师的面试题 -
[54] Innodb分表太多或者表分区太多,会导致内 -
[54] 如何保证一个程序在单台服务器上只有唯一实例( -
[54] 分享一个JQUERY颜色选择插件 -
[53] jQuery性能优化指南 -
[52] 用 Jquery 模拟 select -
[52] CloudSMS:免费匿名的云短信 -
[51] 全站换域名时利用nginx和javascri
