你是说找到系统中所有名字为sleep的进程ID,并且杀死它们,是吗? 我没有LINUX平台测试,我使用的HP-UX,下面的代码你可能需要适当调整才可以使用。 下面的命令可以找出系统中的所有进程: ps -e 要查找所有名称为sleep的经常,有的系统可以给ps使用-n参数,例如: ps -n sleep 但是通用一点的办法是在ps -e的结果里面grep,下面的命令即可: ps -e | grep sleep 前面的ps命令输出了进程的ID、终端等信息,如果只需要ID内容,可以使用cut -c来获取,例如: ps -e | cut -c1-6 获取上面输出的所有PID到内存变量的shell语句是: pids=`ps -e | cut -c1-6`
我们计算的程序都是周期很长的,通常要几个小时甚至一个星期。我们用的环境是用 putty 远程连接到日本 Linux 服务器。所以使程序在后台跑有以下三个好处:
1:我们这边是否关机不影响日本那边的程序运行。(不会像以前那样,我们这网络一断开,或一关机,程序就断掉或找不到数据,跑了几天的程序只能重头再来,很是烦恼)
2:不影响计算效率
3:让程序在后台跑后,不会占据终端,我们可以用终端做别的事情。
方法有很多,这里主要列举两种。假如我们有程序 psocpp ,通过编译后产生可执行文件 pso ,我们要使 pso 在 linux 服务器后台执行。当客户端关机后重新登入服务器后继续查看本来在终端输出的运行结果。(假设 *** 作都在当前目录下)
方法1在终端输入命令:
解释:将 pso 直接放在后台运行,并把终端输出存放在当前目录下的 logfile 文件中。
当客户端关机后重新登陆服务器后,直接查看 psofile 文件就可看执行结果(命令:$ cat psofile )。
方法2在终端输入命令:
解释: nohup 就是不挂起的意思,将 pso 直接放在后台运行,并把终端输出存放在当前
目录下的 psofile 文件中。当客户端关机后重新登陆服务器后,直接查看 psofile
文件就可看执行结果(命令: #cat psofile )。
注:如果要使在前天执行任务放到后台运行,则先要用 ctrl+z 挂起该任务,然后用 bg 使之后台执行。
附:
在 Linux 中,如果要让进程在后台运行,一般情况下,我们在命令后面加上 & 即可,实际上,这样是将命令放入到一个作业队列中了:
对于已经在前台执行的命令,也可以重新放到后台执行,首先按 ctrl+z 暂停已经运行的进程,然后使用 bg 命令将停止的作业放到后台运行:
但是如上方到后台执行的进程,其父进程还是当前终端 shell 的进程,而一旦父进程退出,则会发送 hangup 信号给所有子进程,子进程收到 hangup 以后也会退出。如果我们要在退出 shell 的时候继续运行进程,则需要使用 nohup 忽略 hangup 信号,或者 setsid 将将父进程设为 init 进程(进程号为 1 )
上面的试验演示了使用 nohup/setsid 加上 & 使进程在后台运行,同时不受当前 shell 退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用 disown 命令:
另外还有一种方法,即使将进程在一个 subshell 中执行,其实这和 setsid 异曲同工。方法很简单,将命令用括号() 括起来即可:
注:本文试验环境为 Red Hat Enterprise Linux AS release 4 (Nahant Update 5) , shell 为 /bin/bash ,不同的 OS 和 shell 可能命令有些不一样。例如 AIX 的 ksh ,没有 disown ,但是可以使用 nohup -p PID 来获得 disown 同样的效果。
还有一种更加强大的方式是使用 screen ,首先创建一个断开模式的虚拟终端,然后用 -r 选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到 nohup 的效果,这在有多个命令需要在后台连续执行的时候比较方便:
sh /usr/local/sbin/gdas/startsh
改为
source /usr/local/sbin/gdas/startsh
用sh方式去执行就是另开一个shell去跑,相当于是异步的,不等startsh执行完就执行下面的判断了。用source在当前shell执行该脚本,就是阻塞方式,就不存在此问题了。
建议先手动执行脚本,检验无误了再加入crontab
cd `dirname $0` //首先cd到脚本所在目录
jar_file=$(ls jar) //然后列出jar格式的文件,并赋值给jar_file变量
module_name=${jar_file%} //删掉最后一个 及其右边的字符串,即扩展名
now_date=$(date +%Y-%m-%d) //按格式取当前日期
// 下面这句是查找名为变量 module_name 的进程,然后再找java进程。
// 然后显示出第一行,第二个域。总的来说就是查找进程的PID
pid=$(ps -ef|grep ${module_name}|grep java|head -n 1|awk '{print $2}');
echo kill ${module_name} pid:${pid} // 结束上面找到进程
kill -9 $pid
// 设置JVM运行参数,最小内存386mb,最大内存512mb
JAVA_OPTS="-Xms386m -Xmx512m" 设置
// 如果没有logs目录则新建
if [ ! -d "logs" ]; then
mkdir logs
fi
// 重新执行变量jar_file变量指向的文件,并输出日志到logs目录下的out文件中,同时重新查找pid。
nohup java $JAVA_OPTS -jar ${jar_file} $params > logs/${module_name}out 2>&1 &
pid=$(ps -ef|grep ${module_name}|grep java|head -n 1|awk '{print $2}');
// 显示进程信息。
echo module:${module_name} startup finish pid:${pid}
sleep 05
echo ${pid} > ${module_name}pid
综上所述,这段代码用于重启spring boot进程。
ps aux|awk '{if($8=="X"||$8=="T"||$8=="Z") {flag=1;print}}END{if(flag==0)print "Process is running normally"}'
以上就是关于一个shell脚本,kill进程kill -9 ${PROC_ID}的时候没有立即kill全部的内容,包括:一个shell脚本,kill进程kill -9 ${PROC_ID}的时候没有立即kill、shell脚本让进程在后台运行以及进程后台转前台、shell 脚本检测当前脚本已在执行则kill等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)