【问题标题】:Bash pid returns nothing at allBash pid 什么都不返回
【发布时间】:2012-03-13 10:29:09
【问题描述】:

我正在通过一本名为《学习 bash shell》的书来学习 bash。一切都很好,直到我遇到kill 命令。我创建了一个名为loop 的小脚本,然后使用loop & 运行它。当我使用kill %loop,然后使用ps -e | grep loop时,过程仍然存在。那我是不是没能杀死它?我必须使用kill -9 吗?另外,当我使用pidof loop 时,pidof 似乎根本不起作用。它什么也不返回。

我正在使用 Ubuntu 和 bash。虽然我认为脚本应该无关紧要,但以防万一:

#! /bin/bash
# Just a script
while true; do
    sleep 60
done

【问题讨论】:

    标签: bash ubuntu kill


    【解决方案1】:

    Shell 脚本不以脚本名称运行。它们以您在 shebang 中指定的 shell 的名称运行。在你的情况下,那是/bin/bash。如果您完成了pidof bash,您将获得脚本的 pid(以及当时正在运行的所有其他 bash 脚本)。

    话虽如此,你不能用它们的名字来杀死脚本,因为你正在尝试使用kill %loop。 Kill 只接受 pid。如果您使用% 表示法,那么它指的是shell 分配的内部作业号。例如,以循环脚本为例:

    $ ./loop &  <-- first run of loop script
    [1] 8077    <--- job #1, running as pid 8077
    $ ./loop &  <--- second run of loop script
    [2] 8079    <-- job #2, running as pid 8079
    $ jobs
    [1]-  Running                 ./loop &
    [2]+  Running                 ./loop &
    $ kill %2
    $ jobs
    [1]-  Running                 ./loop &
    [2]+  Terminated              ./loop    <-- note, showing 'terminated' now
    $ kill -9 8077
    $ jobs
    [1]+  Killed                  ./loop
    $ jobs
    $
    

    【讨论】:

    • 很好的答案。也可以运行pidof -x loop通过脚本名获取进程的pid。
    • 内置的 bash kill 绝对接受作业名称,只要它们不模棱两可。
    • 不在我使用的 bash 上:kill %loop -> bash: kill: %loop no such job,在 GNU bash, version 3.00.15(1)-release (i386-redhat-linux-gnu)
    • @evilotto 是的,这就是为什么当我有多个循环作为后台作业运行时无法使用 kill %loop :P
    • @MansoorSiddiqui pidof -x 循环就像一个魅力。非常感谢。
    猜你喜欢
    • 2012-06-18
    • 2018-09-10
    • 2017-02-14
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多