shell脚本中 杀死可能成为僵尸进程的方法
交互式 Bash Shell 获取进程 pid
在已知进程名(name)的前提下,交互式 Shell 获取进程 pid 有很多种方法,典型的通过 grep 获取 pid 的方法为(这里添加 -v grep是为了避免匹配到 grep 进程):
ps -ef | grep "name" | grep -v grep | awk '{print $2}'
或者不使用 grep(这里名称首字母加[]的目的是为了避免匹配到 awk 自身的进程):
ps -ef | awk '/[n]ame/{print $2}'
如果只使用 x 参数的话则 pid 应该位于第一位:
ps x | awk '/[n]ame/{print $1}'
最简单的方法是使用 pgrep:
pgrep -f name
如果需要查找到 pid 之后 kill 掉该进程,还可以使用 pkill:
pkill -f name
如果是可执行程序的话,可以直接使用 pidof
pidof name
Bash Shell 脚本获取进程 pid
根据进程名获取进程 pid
在使用 Shell 脚本获取进程 pid 时,如果直接使用上述命令,会出现多个 pid 结果,例如
1 |
#! /bin/bash |
执行 process-monitor.sh 会出现多个结果:
$> sh process-monitor.sh
3036 3098 3099
进一步排查可以发现,多出来的几个进程实际上是子 Shell 的(临时)进程:
root 3036 2905 0 09:03 pts/1 00:00:45 /usr/java/jdk1.7.0_71/bin/java ...name
root 4522 2905 0 16:12 pts/1 00:00:00 sh process-monitor.sh name
root 4523 4522 0 16:12 pts/1 00:00:00 sh process-monitor.sh name
其中 3036 是需要查找的进程pid,而 4522、4523 就是子 Shell 的 pid。 为了避免这种情况,需要进一步明确查找条件,考虑到所要查找的是 Java 程序,就可以通过 Java 的关键字进行匹配:
1 |
#! /bin/bash |
获取 Shell 脚本自身进程 pid
这里涉及两个指令: 1. $$ :当前 Shell 进程的 pid 2. $! :上一个后台进程的 pid 可以使用这两个指令来获取相应的进程 pid。例如,如果需要获取某个正在执行的进程的 pid(并写入指定的文件):
myCommand && pid=$!
myCommand & echo $! >/path/to/pid.file
注意,在脚本中执行
$!只会显示子 Shell 的后台进程 pid,如果子 Shell 先前没有启动后台进程,则没有输出。
查看指定进程是否存在
在获取到 pid 之后,还可以根据 pid 查看对应的进程是否存在(运行),这个方法也可以用于 kill 指定的进程。
if ps -p $PID > /dev/null
then
echo "$PID is running"
# Do something knowing the pid exists, i.e. the process with $PID is running
fi
shell脚本中 杀死可能成为僵尸进程的方法的更多相关文章
- Shell脚本中计算字符串长度的5种方法
有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前Shell中获取字符串的长度的多种方法,在这里分享给大家,方法如下: 方法1: 使用wc -L命令wc -L可以获取到当前行 ...
- shell脚本中获取本机ip地址的方法
ipaddr='172.0.0.1' ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/ ...
- 杀死Linux中的defunct进程(僵尸进程)的方法指南
杀死Linux中的defunct进程(僵尸进程)的方法指南_LINUX_操作系统_脚本之家https://www.jb51.net/LINUXjishu/457748.html 这样能看到僵尸进程.
- linux crontab执行shell脚本中包含相对路径的问题
实例一 test.sh文件 echo `date`>test.log 配置crontab 设置 */1 * * * * sh /data/test.sh 在/data/目录下,未找到test.l ...
- Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载
Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...
- shell脚本中常见的一些特殊符号和作用详解
这篇文章主要介绍了shell脚本中常见的一些特殊符号和它的作用详解,总结的很简洁,容易看懂,需要的朋友可以参考下 在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我 ...
- Shell 脚本中调用另一个 Shell 脚本的三种方式
主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...
- shell脚本中一些特殊变量
在shell脚本中,一些常见的特殊变量表示方式还是需要知道的 如下就是一些经常用到的特殊变量表示方法: $0 当前脚本名$1 $2... 传入脚本or函数的参数(大于10需大括号括起来)$ ...
- Shell脚本中的并发(转)
转自http://blog.csdn.net/wangtaoking1/article/details/9838571 主要记录一下Shell脚本中的命令的并发和串行执行. 默认的情况下,Shell脚 ...
随机推荐
- JS与ajax遍历list
示例: <script> <c:forEach var="yanan" items="${yananList}"> ...
- android dialog弹出的情况下监听返回键
view = LayoutInflater.from(getActivity()).inflate( R.layout.dialog_tips, null); title2 = (TextView) ...
- java Object类是可以接收集合类型的
废话不多说,上代码: package com.core.test; import java.util.ArrayList; import java.util.HashMap; import java. ...
- MVVM之旅(1)创建一个最简单的MVVM程序
这是MVVM之旅系列文章的第一篇,许多文章和书喜欢在开篇介绍某种技术的诞生背景和意义,但是我觉得对于程序员来说,一个能直接运行起来的程序或许能够更直观的让他们了解这种技术.在这篇文章里,我将带领大家一 ...
- JAVA并发编程学习笔记------基础构建模块
一.并发容器:ConcurrentHashMap:1.分段锁机制: 任意数量的读取线程可以并发的访问map,执行读取操作的线程和执行写入操作的线程可以并发的访问Map,并且一定数量的写入线程可以并发的 ...
- xBIM 格式之间转换
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- es数据恢复杂记
kill -9或者断电等原因异常,es在重启后,会通过translog来进行数据恢复. 默认的恢复速度是较慢的,可以设置indices.recovery.current_streams:10增大恢复的 ...
- Linux 虚拟机忘记root密码
Linux 虚拟机忘记root密码可以按照下面的步骤重新设置密码: 1.在grub界面,也就是有press any key的那个界面,按下任意键 2.键入e,出现三行文字,按上下键选择kernel那一 ...
- java多线程之内存可见性-synchronized、volatile
1.JMM:Java Memory Model(Java内存模型) 关于synchronized的两条规定: 1.线程解锁前,必须把共享变量的最新值刷新到主内存中 2.线程加锁时,将清空工作内存中共享 ...
- JDK,JRE,JVM的区别与联系
JDK : Java Development ToolKit(Java开发工具包).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工 ...