.bash_profile 中的一个函数

.bash_profile 中的一个函数

我尝试在.bash_profile中编写一个函数来定义一个用于终止进程的函数,如下所示:

function pkill {
                pid = ps -elf|grep python|grep $1|awk -F " " '{print $4}'
                kill -9 pid
}

我想要做的是使用“pkill keyword”来杀死pid=[ps -elf|grep python|grep keyword|awk -F " " '{print $4}']的进程,但我的代码不起作用。我应该如何编写这个函数?

关于kill:
我的python进程是多线程的。我尝试过kill pid,,kill -TERM pid或者kill -INT pid,但仍然可以在进程列表中找到它。所以我使用了“kill -9”。

答案1

pid=$(ps -elf|grep vim|grep 'screenrc' | awk -F" " '{print $4}')

但你也许可以使用程序包反而:

pid=$(pgrep -f "python .*$1")

或者

pids=$(pgrep -d' ' -f "python .*$1")
kill -9 $pids

如果你感觉自信(鲁莽!):

\pkill -9 -f "python .*$1"

答案2

您列出并丢弃大量多余的垃圾有什么理由吗?

(我假设您正在使用 GNU ps,但我更喜欢 BSD ps 语法。它也受 GNU ps 支持,因为 GNU ps 支持一切。)

 # as others have noted 'pkill' is an existing command, so let's not clash with its name
 function pypkill {
      pids=$(ps ax -opid= -ocomm= | grep python | grep "$1" | awk -F " " '{print $1}')
      kill -TERM $pids
 }

分解:

  • pid=
    • 子 shell 可能会返回多个 PID。这将捕获所有 PID
  • $( )
    • 子 shell。括号内的命令将被执行,并返回其输出。
  • 聚苯乙烯
    • 显示系统上的所有进程(BSD 语法)
  • -opid=-ocomm=
    • 告诉 ps 输出两列:PID 和命令名称,并省略标题行
  • 杀死-TERM $ pids
    • 使用 kill -9 是最后的手段。在大多数情况下,您需要的是 kill -TERM,或者可能是 kill -INT,然后再诉诸 kill -KILL。

答案3

这难道不应该更像

  pid=$(ps -elf|grep python|grep $1|awk -F" " '{print $4}')
  kill -9 $pid

相关内容