用shell脚本重启进程
2014-11-19 09:24
134 查看
最近在调试服务器程序的时候,经常要重启进程,每次都要先查看PID、再kill掉、再启动进程,启动完了还要查看是不是启动成功了。略烦。
于是想要写个shell脚本做以上几件事,一了百了。
功能需求:
1、杀死指定进程
2、启动指定进程
3、检查指定进程是否启动
算法思路:
1、ps工具查找进程
2、grep工具在ps找出的进程中筛选指定进程
3、awk工具在筛选出的进程信息中找出PID
4、kill工具结束PID
5、启动进程
6、第一步+第二步判断进程是否启动
水平有限,目前这是我能想到的唯一方法。
如果你有更好更简便的方法,请给我留言,不胜感激。
动手:
先在命令行模式下测试
1、启动一个小程序,内容如下:
void main(){
while(1){
}
}
没什么,就是个测试程序,保证它能一直存在就可以了。
程序名为 test
后台运行程序
./test &
2、ps -u可查看'我'的进程
第一行报了个Warning,实在不理解什么意思。不过好像没什么影响,暂时放过了。
3、grep + [程序名] 筛选指定进程
grep也在结果中,再筛选一次,用-v过滤掉grep
ok。第二列就是我要找的PID了。
4、awk筛选PID
PID出现了。接下来就是杀掉它了。
5、 kill根据PID杀掉进程
kill是不支持管道的。怎么办?
那就先执行第4步, 再执行kill 第4步返回的PID就是了
注意:包裹ps -u……那段代码的是tab键上面的那个键,不是单引号。
可以看到,test进程已经成功被杀掉。
6、重新启动进程
考虑到将来运行shell脚本的路径不确定,所以用绝对路径启动进程就是了。
7、检查进程是否成功启动
用判断符号 [ -z "$[变量名]"] 来判断变量是否为空
测试到此为止,下面开始写shell脚本:
#!/bin/bash
#Program
# The program is used to restart a process
#Auth:
# Jimmy
#Date:
# 2014-11-18
#检查是否有输入参数
[ -z "$1" ] && echo "you should input the process name !" && exit 0
#检查输入参数是否指向可执行文件
if test ! -e $1 || test ! -x $1;then
echo "please input the absolute path of your process"
exit 0
fi
#杀进程
kill -9 `ps -u | grep $1 | grep -v grep | grep -v sh| awk '{print $2}'`
#重启进程
$1 &
#检查进程是否启动
[ -z "`ps -u | grep $1 | grep -v grep | grep -v sh | awk '{print $2}'`" ] && echo "process $1 is not running" || echo "process $1 is running"
可以看到,/home/jimmy/test 这个程序在运行 myshell之后,PID、启动时间和运行时间都改变了,说明这个程序重启成功。
这只是个简单的shell脚本,就不进行其他测试了。
程序cpu占用问题,就不要在意啦 ,毕竟随手写的测试程序,也是在本地虚拟机里跑的,没考虑那么多了。
小结:
之前虽然看过一些shell,但仍然感觉shell语法相当晦涩,难写难读,也有可能是第一次写,各种不熟悉所致。
这个shell还不够灵活,目前只能使用程序的绝对路径,而且暂时还不支持有输入参数的程序。
如有问题,还请不吝赐教,本人不胜感激。
于是想要写个shell脚本做以上几件事,一了百了。
功能需求:
1、杀死指定进程
2、启动指定进程
3、检查指定进程是否启动
算法思路:
1、ps工具查找进程
2、grep工具在ps找出的进程中筛选指定进程
3、awk工具在筛选出的进程信息中找出PID
4、kill工具结束PID
5、启动进程
6、第一步+第二步判断进程是否启动
水平有限,目前这是我能想到的唯一方法。
如果你有更好更简便的方法,请给我留言,不胜感激。
动手:
先在命令行模式下测试
1、启动一个小程序,内容如下:
void main(){
while(1){
}
}
没什么,就是个测试程序,保证它能一直存在就可以了。
程序名为 test
后台运行程序
./test &
2、ps -u可查看'我'的进程
第一行报了个Warning,实在不理解什么意思。不过好像没什么影响,暂时放过了。
3、grep + [程序名] 筛选指定进程
grep也在结果中,再筛选一次,用-v过滤掉grep
ok。第二列就是我要找的PID了。
4、awk筛选PID
PID出现了。接下来就是杀掉它了。
5、 kill根据PID杀掉进程
kill是不支持管道的。怎么办?
那就先执行第4步, 再执行kill 第4步返回的PID就是了
注意:包裹ps -u……那段代码的是tab键上面的那个键,不是单引号。
可以看到,test进程已经成功被杀掉。
6、重新启动进程
考虑到将来运行shell脚本的路径不确定,所以用绝对路径启动进程就是了。
7、检查进程是否成功启动
用判断符号 [ -z "$[变量名]"] 来判断变量是否为空
测试到此为止,下面开始写shell脚本:
#!/bin/bash
#Program
# The program is used to restart a process
#Auth:
# Jimmy
#Date:
# 2014-11-18
#检查是否有输入参数
[ -z "$1" ] && echo "you should input the process name !" && exit 0
#检查输入参数是否指向可执行文件
if test ! -e $1 || test ! -x $1;then
echo "please input the absolute path of your process"
exit 0
fi
#杀进程
kill -9 `ps -u | grep $1 | grep -v grep | grep -v sh| awk '{print $2}'`
#重启进程
$1 &
#检查进程是否启动
[ -z "`ps -u | grep $1 | grep -v grep | grep -v sh | awk '{print $2}'`" ] && echo "process $1 is not running" || echo "process $1 is running"
可以看到,/home/jimmy/test 这个程序在运行 myshell之后,PID、启动时间和运行时间都改变了,说明这个程序重启成功。
这只是个简单的shell脚本,就不进行其他测试了。
程序cpu占用问题,就不要在意啦 ,毕竟随手写的测试程序,也是在本地虚拟机里跑的,没考虑那么多了。
小结:
之前虽然看过一些shell,但仍然感觉shell语法相当晦涩,难写难读,也有可能是第一次写,各种不熟悉所致。
这个shell还不够灵活,目前只能使用程序的绝对路径,而且暂时还不支持有输入参数的程序。
如有问题,还请不吝赐教,本人不胜感激。
相关文章推荐
- linux启动java进程的shell脚本(包括启动,停止,重启)
- 用shell脚本监控进程,挂掉后重启
- 【Shell/Python】Linux 进程自动监控bash shell脚本 监控VPS服务器负载/CPU及内存占用 自动重启
- linux下监视进程 崩溃挂掉后自动重启的shell脚本
- linux下监视进程 崩溃挂掉后自动重启的shell脚本
- 重启服务进程 shell脚本
- 【原】用shell脚本监视进程,崩溃挂掉后自动重启
- 基于HBase和ZK 高可用集群环境 Shell脚本启动、关闭、重启、查看进程
- Shell脚本之监视主进程的运行状态,异常退出后自动重启
- 用shell脚本监控进程,挂掉后重启
- shell脚本杀进程重启
- shell脚本强制进程重启
- shell脚本中重启tomcat进程
- Shell脚本检查memcache进程并自动重启
- 一个监控Squid运行进程数并自动重启的简洁Shell脚本分享
- shell脚本检测服务器进程并重启以及失败预警
- 一个监控Squid运行进程数并自动重启的简洁Shell脚本分享
- linux下监视进程 崩溃挂掉后自动重启的shell脚本
- 用Shell脚本定时监控Linux下的进程状态并自动重启
- 脚本监控2个进程有进程死掉重启进程