首页 > 系统相关 >shell查询进程杀死进程并等待进程退出

shell查询进程杀死进程并等待进程退出

时间:2022-12-02 14:58:59浏览次数:59  
标签:shell process pid echo kill 进程 查询 local

查询并杀死进程

stop_service() {
	# 查询Java进程ID
	local pid=$(ps -ef | grep java | grep "${process_keyword}" | grep -v grep | awk '{print $2}')
        # 如果进程ID不为空
	if [[ -n $pid ]]; then
		echo "Try to kill $pid"
                # 杀死进程并等待进程退出  
		kill $pid && wait_for_process_exit "$pid"
	fi
}

等待进程退出

利用 kill -0 检查进程是否存在

shell 命令 “kill -0” 的作用
使用 kill -0 pid 检查一个进程是否存在

  • 若存在,即进程在运行,执行 echo $? 会返回 0。
  • 若不存在,即进程已停止运行,执行 echo $? 会返回 1。

首先,用以下脚本说明上述结论:

#/bin/bash

kill -0 83594
echo $?

kill -0 183594
echo $?

其中,进程 83594 是存在的,但是 183594 是不存在的。

打印结果:

但是,要理解这个返回结果,还是得知道 kill -0 pid 不发送任何信号,但是系统会进行错误检查。

  • 0 表示正常,没有错误,那进程还正常运行,那肯定还存在呀;
  • 1 表示错误,确实抛出了 No such process 错误,进程也不在了;
  • 另外,Linux 的返回码规则是除 0 以外全是错误;

使用 if kill -0 pid; 判断

因此,我们可以搭配上 if 进行判断了:

#/bin/bash

if kill -0 83594; then
  echo "83594 alive"
fi
if kill -0 183594; then
  echo "183594 alive"
fi

打印结果:

优化

我们还需要以下优化:

  1. 隐去错误日志;
  2. 把 if 改成 while 循环;
  3. 加上 1s 间隔,并打印.表示仍在运行
# 等待进程结束
wait_for_process_exit() {
	local pidKilled=$1
	while kill -0 $pidKilled > /dev/null 2>&1
	do
		echo -n "."
		sleep 1;
	done
}
  1. 加一个超时机制,避免死循环:
#/bin/bash

wait_for_process_exit() {
        local pidKilled=$1
        local begin=$(date +%s)
        local end
        while kill -0 $pidKilled > /dev/null 2>&1
        do
                echo -n "."
                sleep 1;
                end=$(date +%s)
                if [ $((end-begin)) -gt 60  ];then
                        echo "timeout"
                        break;
                fi
        done
}

wait_for_process_exit 83594

标签:shell,process,pid,echo,kill,进程,查询,local
From: https://www.cnblogs.com/kendoziyu/p/16944461.html

相关文章

  • Hbase_Shell
    Hbase常用Shell命令一、基本命令        1.1获取帮助        1.2查看服务器状态        1.3查看版本信息二、关于表的操作    ......
  • 进程异常core文件分析
    1. core文件相关配置1.1 查看core文件是否开启Corefilesize为0代表关闭core文件,unlimited代表开启core文件。开启core文件以后,代表进程异常以后,会生成core文件。使用......
  • Linux如何查看当前占用CPU或内存最多的K个进程
    内存可以使用以下命令查使用内存最多的K个进程方法1:ps-aux|sort-k4nr|head-K如果是10个进程,K=10,如果是最高的三个,K=3说明:ps-aux中(a指代a......
  • MYSQL BACKUP的SHELL相关语句
    #!/bin/bash###############Basicparameters##########################DAY=`date+%Y%m%d`Environment=$(/sbin/ifconfig|grep"inetaddr"|head-1|grep-v"127.0.......
  • 笔记: MYSQL BACKUP的SHELL相关语句
    #!/bin/bash ###############Basicparameters########################## DAY=`date+%Y%m%d` Environment=$(/sbin/ifconfig|grep"inetaddr"|head-1|grep-......
  • mysql中查询连接工作状态
    #!/bin/bashwhiletruedomysql-uroot-e'showprocesslist\G'|grepState:|uniq-c|sort-rnecho'---'sleep1Done如果观察到以下状态,则需......
  • 12Linux进程管理(重点)
    进程管理基本介绍ps指令processstatus:命令用于显示当前进程的状态,类似于windows的任务管理器。语法ps[options][--help]参数:ps的参数非常多,在此仅列出......
  • 16Linux大数据定制篇Shell
    ShellShell快速入门实例sh./myShell.sh可在无执行权限下强制执行(了解)变量Shell变量介绍输出系统变量自定义变量静态变量(readonly)不能unset基础规则......
  • 几个有用的oracle dba_hist_*查询语句
    耗CPU最多的10条语句select*from(selects.SQL_ID,sum(s.CPU_TIME_DELTA),sum(s.DISK_READS_DELTA),count(*)fromDBA_HIST_SQLSTATsg......
  • Linux将shell脚本设置为自动启动项
    Linux系统下如何设置开机启动项1.修改/etc/rc.d/rc.local文件,在rc.local后面加上你的shell脚本命令赋值权限chmodu+xapp.sh修改后的rc.local如下#!/bin/bash#THISFILE......