【问题标题】:How to kill postgres processes that won't die?如何杀死不会死的postgres进程?
【发布时间】:2014-09-25 00:58:25
【问题描述】:

我根据ps aux | grep postgres 运行了以下进程

postgres 8720 0.0 0.0 2492848 5652 ??下午 2 点 33 分
0:00.04 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared postgres 495 0.0 0.0 2514428 1776 ??下午 1:57 0:00.07 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdflagwriter postgres 491 0.0 1.0 2669764 166180 ??下午 1 点 57 分
0:10.31 com.apple.IconServicesAgent postgres 490 0.0 0.0 2505832 2884 ?? Ss 1:57PM 0:00.07 /usr/libexec/xpcd postgres 485 0.0 0.0 2514284 1284 ??下午 1:57 0:00.07 /usr/sbin/cfprefsd 代理 postgres 484 0.0 0.0 2536788
1708 ?? S 1:57PM 0:00.06 /usr/sbin/distnoted 代理 postgres
479 0.0 0.0 2508256 1100 ??下午 1:57 下午 0:00.06 /sbin/launchd postgres 427 0.0 0.0 2493792 608 ?? Ss 1:55PM 0:00.02 postgres:统计收集器进程 postgres 426 0.0 0.0 2654624 2208 ?? Ss 1:55PM 0:00.02 autovacuum 启动器进程 postgres 425 0.0 0.0 2646300 764 ?? Ss 1:55PM 0:00.03 postgres: wal 作家 处理 postgres 424 0.0 0.0 2638108 1608 ??不锈钢 下午 1:55 0:00.07 postgres:编写器进程 postgres 423
0.0 0.0 2638108 836 ?? Ss 1:55PM 0:00.00 postgres:检查点进程 postgres 419 0.0 0.0 2493792
500?? Ss 1:55PM 0:00.00 postgres:记录器进程 postgres 85 0.0 0.1 2638108 13844 ??下午 1:55 下午 0:00.04 /Library/PostgreSQL/9.3/bin/postmaster -D/Library/PostgreSQL/9.3/data 用户名 8910 0.0 0.0 2432784 612 s003 R+ 2:35PM
0:00.00 grep postgres

我要他们死!

但是 killall postgres 给了我:

No matching processes belonging to you were found

我知道我需要使用:

kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`

但我不明白这个命令。

感谢您的指导。漫长的令人沮丧的早晨!

【问题讨论】:

  • 您是否尝试过kill -9 8720(其中8720 是PID)?请注意,这可能会导致数据丢失,因为操作系统会以非常不友好的方式终止进程。
  • 酷。我会发布更详细的答案。
  • @CmdrMoozy 现在它不起作用了。太奇怪了。
  • 我在我的答案中添加了一些额外的注释,这可能解释了为什么它有时不起作用。看看他们是否有帮助。

标签: postgresql


【解决方案1】:

一般情况下,您可以使用kill 命令停止正在运行的进程。更具体地说,kill 向进程发送信号。最基本的 kill 命令是这样的:

kill <pid>

这会向进程发送SIGTERM 信号,告诉它们停止。

有时,您会遇到一个真正卡住的进程,并且似乎没有响应 SIGTERM。在这种情况下,您可以通过以下方式告诉kill 命令稍微(或者,您知道,更多)执行以下操作:

kill -9 <pid> 或等效的kill -KILL <pid>

这会将SIGKILL 信号发送到进程,其效果(非常普遍)是操作系统立即将进程从运行队列中取出,并停止它。 一般来说,这可能有点危险,因为它不会让程序更改为“清理”或以任何合理的方式完成运行。它只是立即停止它。

您可以在Wikipediaman pages(本地计算机上的man kill)中找到有关kill 的更多信息。该命令在 Linux、UNIX、BSD 和 OS X 中是相当标准的,因此文档应该或多或少适用于其中任何一个。

此外,您还可以在Wikipedia 上找到有关不同信号的用途的更多信息。

另外,我发现this song 让我永远不会忘记这个命令的工作原理。

编辑:有时,有些进程只是不能被杀死。发生这种情况的最常见情况之一是进程处于D 状态(请参阅ps axu 输出中的STAT 列)。这种状态意味着进程是不可中断的,通常是因为它正在等待某些 I/O 操作完成而由于各种原因永远不会完成。更多信息here.

另一个注意事项:有时杀死进程不起作用,因为您需要杀死 父进程,而不是某些工作进程,它是 fork'ed。您可以使用命令ps axjf 查看进程“层次结构”(即父/子关系)。您可以在man page(本地计算机上的man ps)中查看有关ps 命令的更多信息。与kill 一样,ps 命令非常标准,因此文档应主要适用于所有各种类 UNIX 操作系统。

【讨论】:

    【解决方案2】:

    另外,我发现这个answer 为我解决了这个问题。

    杀死所有名为“postgres”的进程

    pkill postgres
    

    【讨论】:

    • 不起作用。 jim 9813 0.0 0.0 22564 944 pts/1 S+ 15:09 0:00 grep --color=auto postgres
    • @mLstudent33 - 从您的评论打印出来,您已经运行了命令ps | grep postgres。正如您在打印出来的文字中看到的那样,greppostgres 在那里,这是因为您已经返回了刚刚运行的进程。最好使用ps | pgrep postgres。 tl;博士 - 它确实有效!
    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 2015-02-18
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多