【问题标题】:Trying to kill process by shell scripting试图通过 shell 脚本杀死进程
【发布时间】:2013-11-11 01:48:40
【问题描述】:

我想通过 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 memcacheps -ef | grep "memcache" | awk '{print $2}' 的结果是什么?看起来不错。
  • pidof memcache 没有给出任何东西,没有错误没有 id。
  • 实际上ps -ef | grep memcache 会给出两行.. 所以你可以这样ps -ef | grep memcache | grep -v "grep" | awk '{print $2}' | xargs kill;
  • @Ashish:它给出错误“:没有这样的文件或目录”,但是当我运行 ps -ef | grep 内存缓存 | grep -v "grep" 它只给出一个进程。 awk 的问题...

标签: bash shell ubuntu


【解决方案1】:

确实

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

【讨论】:

  • 它在我将 PID 存储为第 3 行的行给出错误:PID:找不到命令
  • 我得到 pid 但无法存储在变量中。
  • 什么是o/p ps -ef | grep memcache | grep -v "grep" | awk '{print $2}'
  • 嘎嘎,useless uses of grep 嘉豪!你的意思是ps -ef | awk '/[m]emcache/{print$2}'
  • psgrepawk 的无用用法!这可以替换为pkill -f -9 memcache
【解决方案2】:

您可以使用以下命令: pkill memcached 要么 pgrep memcached | xargs kill -9 要么 killall memcached.

pgrep、pkill - 根据名称和其他属性查找或通知进程。

【讨论】:

  • @SureshKamrushi 如果不使用参数-9,可以吗?
  • 没有 -9 会给出错误“kill: Operation not allowed my_test_batch.sh: line 3: $'\r': command not found”
  • @SureshKamrushi 对不起,我帮不了你。你的linux是什么版本?其他两个命令是否有效?
  • 感谢 BlackMamba 付出的时间和努力。
  • 错误消息似乎表明您以某种方式在某处获得了 DOS 回车。不管怎样,这是正确的答案。 +1
【解决方案3】:

您的第一个命令可能会在有机会杀死目标进程之前杀死自己。

要获得可靠的方法,请运行 pkill /usr/bin/memcachedpkill -9 /usr/bin/memcached,尽管后者是一种不好的做法。

【讨论】:

    【解决方案4】:

    对于第一个命令,您会看到有 两个 进程与您的 grep 模式匹配。实际的memcached 进程和您的grep 进程。这大概就是第一个命令行出错的原因吧。

    尝试缩小搜索范围,例如通过 grepping for 例如"^memcache.*/usr/bin/memcached".


    第二个错误的问题是您使用 用户名 而不是进程名称调用pidof,因此该命令本质上是kill -9,没有任何进程ID。尝试改为例如pidof memcached 获取正确进程的进程id。

    【讨论】:

    • 我尝试这样:sudo ps -ef | grep ^memcache.*/usr/bin/memcached | awk '{打印 $2}' | xargs 杀死;给出错误:kill: Operation not allowed my_test_batch.sh: line 3: $'\r': command not found
    • @SureshKamrushi 你能试试grep 正则表达式周围的引号吗?
    • 用引号给出错误“:没有这样的文件或目录”。但我在 usr/bin/ 中有 memcached 目录
    【解决方案5】:
    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
    

    【讨论】:

      猜你喜欢
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2012-09-30
      • 1970-01-01
      • 2012-04-22
      • 2012-09-08
      • 1970-01-01
      相关资源
      最近更新 更多