【问题标题】:bash: kill $$ not work?bash:杀死 $$ 不起作用?
【发布时间】:2013-07-10 08:30:16
【问题描述】:

命令kill $$ 应该杀死当前的bash,但似乎不起作用:

$ ps -p $$
  PID TTY          TIME CMD
18179 pts/4    00:00:00 bash
$ kill $$
$ ps -p $$
  PID TTY          TIME CMD
18179 pts/4    00:00:00 bash

为什么?

【问题讨论】:

  • 你从哪里读到kill $$ 应该杀死当前的 bash?
  • 这个可以kill `ps -p $$ | awk 'NR==2{print $1}'`
  • 此外,为什么不只是exit
  • @Antarus:不,修改后的也不会杀死正在运行的 bash。
  • @Antarus `ps -p $$ | awk 'NR==2{print $1}'` 是一种高度复杂的写作方式$$

标签: linux bash kill


【解决方案1】:

我不确定为什么要kill 当前的shell。不过……

kill PID 将在未指定信号时发送SIGTERM。在没有任何陷阱的情况下,bash 会忽略 SIGTERMSIGQUIT

如果你说,你会达到想要的效果

kill -9 $$

kill -SIGKILL $$

引用manual:

当 Bash 是交互式时,在没有任何陷阱的情况下,它会忽略 SIGTERM(这样“kill 0”就不会杀死交互式shell),以及 SIGINT 被捕获并处理(因此内置的等待是 可中断)。当 Bash 收到 SIGINT 时,它会从任何 执行循环。在所有情况下,Bash 都会忽略 SIGQUIT

【讨论】:

  • +1。我从你的回答中学到了很多东西,你是这些主题的专家。我不清楚的是bash ignores SIGTERM and SIGQUIT in the absence of any traps 的含义。你能再解释一下吗?
  • 我偶尔kill -9 $$,以避免命令列表被附加到历史文件中。我可以手动编辑历史文件,但这有时会变成速记。一种肮脏的方式。
  • 指的是trap内置的,可以catch信号。
  • @anishsane 如果您不希望将命令附加到历史记录中,您可以设置 HISTFILE 变量。 export HISTFILE=/dev/null
  • @fedorqui 详细说明,您可以指定当 shell 遇到给定信号时要执行的操作。假设您希望脚本忽略 SIGINT 并打印一条友好消息,您可以说 trap echo "Not permitted!" SIGINT
【解决方案2】:

当您使用 kill 命令向进程发送任何信号时,该进程可以根据自己的意愿选择处理信号。 (有一些信号,无法处理。)

当您使用kill $$ 时,您实际上是在传递信号=15 (SIGTERM)。它可以由一个进程来处理。

你可以googlelinux signal example了解它是如何实现的。

& 回答您的问题: 如果您传递一个不可处理的信号,例如 SIGKILL(9) 或 SIGSTOP(19),它将分别杀死/停止正在运行的 bash 进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多