如何在shell脚本中杀死通过cron运行的进程?

如何在shell脚本中杀死通过cron运行的进程?

我有一个在 cronjob 中运行的 shell 脚本。该 shell 脚本必须终止正在运行的进程并再次启动新进程。

当我手动运行脚本时,它工作得很好,但是当它通过 cron 运行时,它不会杀死旧进程,而是与旧进程一起启动一个新进程。

我正在使用下面的代码行来终止该进程:

杀-9 ps | grep "服务器1" | grep -v grep | grep -v awk '{ 打印 $1 }'

答案1

你必须指出要杀死什么:

kill -9 $(ps | grep "server1" | grep -v grep | awk '{ print $1 }')

你还可以使用这个技巧:

kill -9 $(ps | grep "server[1]" | awk '{ print $1 }')

答案2

在里面最纯粹的形式,您可以使用

pkill server1

这假设server1实际上是进程名称,而不仅仅是命令行中的某个位置 - 否则添加一个-f.

pkill -f server1CommandArgument


可是等等!

你可以测试什么pkill会匹配并用命令杀死pgrep- 这在技术上几乎是相同的。它的区别在于:它不是杀戮,而是打印PID

尝试这些 - 列出匹配的 PID:

pgrep server1

-l列出了进程名称同样,不仅仅是 PID:

pgrep -l server1

-f 与命令行匹配,不仅仅是名字:

pgrep -fl server1

当您想要终止与 匹配的进程时pgrep,请忽略-l,并添加一个信号(如果您想要除默认 SIGTERM 之外的其他信号)-15

pkill -9 server1

由于您的示例使用了普通ps命令,该命令默认仅匹配当前终端上的进程,因此请注意您的命令匹配的内容,因为pgreppkill不仅仅匹配当前终端上的进程。


关于使用的旁注kill -9- 这是最暴力的杀人方式;你确定那是实际需要

这可能并不重要,具体取决于被杀死的程序类型。但是,如果没有充分的理由,您不应该对可能保存任何数据的程序/服务器执行此操作,写入锁定文件等。只要程序没有严重挂起,就可以kill使用默认信号。-15

答案3

在 shell 脚本中你也必须跳过sh。下面的命令对我有用。

ps -aef | grep $1 | grep -v sh| grep -v grep| awk '{print $2}'

脚本:

#!/bin/bash
var=`ps -aef | grep $1 | grep -v sh| grep -v grep| awk '{print $2}'`
if [ !-z "$var"]
then
  echo $1 process is not running 
else
  kill -9 $var
  echo $1 process killed forcefully, process id $var.
fi

参考: 在 shell 脚本中强制终止 linux 进程可以阅读文章以获得完整的解释。

相关内容