尝试使用Shell脚本结束进程

3

我想通过Shell脚本杀死进程,但是它给我返回了错误。以下是我迄今为止尝试过的:

当我尝试杀死memcache时,它会返回"kill: No such process"的错误,我使用了以下命令:

ps -ef | grep "memcache" | awk '{print $2}' | xargs kill; 

或者如果尝试像下面这样:
kill -9 $(pidof memcache)

我遇到了以下错误:“参数必须是进程或作业 ID”,在命令提示符上直接运行时,进程正在运行。
ring@ubuntu:~/parasol$ ps aux | grep memcache     
memcache   873  0.0  0.0 323220  1188 ?        Sl   22:56   0:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1
ring      1714  0.0  0.0   9384   920 pts/0    S+   23:45   0:00 grep --color=auto memcache

我参考了https://askubuntu.com/questions/239923/shell-script-to-9-kill-based-on-nameShell script to capture Process ID and kill it if exist

我的Ubuntu版本:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS"
NAME="Ubuntu"
VERSION="12.04.2 LTS, Precise Pangolin"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu precise (12.04.2 LTS)"
VERSION_ID="12.04"

如果运行 pidof memcache 或者 ps -ef | grep "memcache" | awk '{print $2}' 命令,结果如何?看起来不错。 - keltar
你有检查过 https://dev59.com/qHVC5IYBdhLWcg3w21Iq#160926 吗? - abasu
pidof memcache 不会返回任何内容,没有错误也没有 ID。 - Suresh Kamrushi
实际上,ps -ef | grep memcache 会给出两行结果。因此,你可以这样做:ps -ef | grep memcache | grep -v "grep" | awk '{print $2}' | xargs kill; - Ashish
@Ashish:它会报错“:没有这个文件或目录”,但是当我运行ps -ef | grep memcache | grep -v "grep"时,它只会给出一个进程。awk可能有问题... - Suresh Kamrushi
我使用Linux Mint的GUI,因此有一个Gnome终端进程。我执行了ps -ef | grep gnome-terminal | grep -v "grep" | awk '{print $2}'命令,并获得了PID 2803。 - Ashish
6个回答

9
实际上
ps -ef | grep memcache

将会给出两行代码。

这样你就可以按照这个方式操作。

ps -ef | grep memcache | grep -v "grep" | awk '{print $2}' | xargs kill; 

这可以获得精确的一个PID

如果我必须做的话,我会在一开始把它分成两行。

#!/bin/bash
PID=`ps -ef | grep memcache | grep -v "grep" | awk '{print $2}'`
echo $PID
#to check PID is right
kill -9 $PID

将其保存在名为test.sh的脚本文件中。

然后在终端上执行以下命令:

chmod +x test.sh

那么

./test.sh

输出是什么? ps -ef | grep memcache | grep -v "grep" | awk '{print $2}' - Ashish
你可以创建一个名为test.sh的脚本,将上述代码复制到其中并运行该脚本。 - Ashish
复制现在,它会回显pid。但是在杀死它时会出现以下错误:ring@ubuntu:/parasol$ bash my_test_batch.sh 873 : arguments must be process or job IDs ring@ubuntu:/parasol$ - Suresh Kamrushi
3
大量无用的grep使用啊!你指的是 ps -ef | awk '/[m]emcache/{print$2}' - tripleee
2
大量无用使用 psgrepawk!可以用 pkill -f -9 memcache 替代。 - jlliagre
显示剩余4条评论

3
您可以使用以下命令: pkill memcachedpgrep memcached | xargs kill -9killall memcached。 pgrep、pkill - 根据名称和其他属性查找或信号进程。

如果您不使用参数“-9”,它是否能正常工作?@SureshKamrushi - BlackMamba
没有-9会出现错误"kill: 操作不允许 my_test_batch.sh: 第3行: $'\r': 找不到命令" - Suresh Kamrushi
@SureshKamrushi 抱歉,我无法帮助你。你的Linux版本是多少?另外两个命令有没有起作用? - BlackMamba
感谢BlackMamba的时间和努力。 - Suresh Kamrushi
错误信息似乎表明您在某个地方获得了DOS回车符。不管怎样,这是正确的答案。+1 - tripleee
@tripleee 不管回车符的问题如何,这个答案仍然是不正确的,即它无法捕获memcached。 - jlliagre

2

你的第一个命令可能在杀死目标进程之前先自我终止。

为了可靠的方式,请运行pkill /usr/bin/memcachedpkill -9 /usr/bin/memcached,尽管后者是不良实践。


1
对于第一个命令,您会发现有两个进程与您grep的模式匹配。实际上是memcached进程和您的grep进程。这可能是第一条命令行出错的原因。
尝试缩小搜索范围,例如通过grep "^memcache.*/usr/bin/memcached"
第二个错误的问题在于你正在使用用户名而不是进程名来调用pidof,因此该命令本质上是没有任何进程ID的kill -9。尝试使用例如pidof memcached来获取正确进程的进程ID。

我尝试这样做: sudo ps -ef | grep ^memcache.*/usr/bin/memcached | awk '{print $2}' | xargs kill;但是出现了错误: kill: 操作不允许 my_test_batch.sh: 第3行:$'\r':找不到命令 - Suresh Kamrushi
@SureshKamrushi 你可以尝试在 grep 正则表达式周围加上引号吗? - Some programmer dude
"使用引号会出现错误:“:没有这个文件或目录”。但是我在usr/bin/中有memcached目录。" - Suresh Kamrushi

-1
ps -ef | grep "memcache" | awk '{print $2}' | xargs kill; 
PID=`ps -ef | grep memcache | grep -v "grep" | awk '{print $2}'`
#...

首先,在这种情况下,您可以使用cut而不是awk。没有必要用坦克打死一只苍蝇 ;)

然后,为什么需要粗暴地杀死memcache?您有一个守护程序来停止它:

/etc/init.d/memcached stop
service memcached stop

-2
如果您的应用程序正在运行端口,您可以使用这个。
lsof -t -i :port# | xargs kill -9 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接