我有一个在 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
命令,该命令默认仅匹配当前终端上的进程,因此请注意您的命令匹配的内容,因为pgrep
和pkill
不仅仅匹配当前终端上的进程。
关于使用的旁注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 进程可以阅读文章以获得完整的解释。