如何杀死不会死的postgres进程?

时间:2014-08-01 18:47:02

标签: postgresql

我按照ps aux | grep postgres

运行以下流程
  

postgres 8720 0.0 0.0 2492848 5652 ?? SN 2:33 PM
  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 ?? S 1:57 PM 0:00.07   /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdflagwriter   postgres 491 0.0 1.0 2669764 166180 ?? Ss 1:57 PM
  0:10.31 com.apple.IconServicesAgent postgres 490 0.0 0.0   2505832 2884 ?? Ss 1:57 PM 0:00.07 / usr / libexec / xpcd postgres   485 0.0 0.0 2514284 1284 ?? S 1:57 PM 0:00.07   / usr / sbin / cfprefsd agent postgres 484 0.0 0.0 2536788
  1708 ?? S 1:57 PM 0:00.06 / usr / sbin / distnoted agent postgres
  479 0.0 0.0 2508256 1100 ?? Ss 1:57 PM 0:00.06   / sbin / launchd postgres 427 0.0 0.0 2493792 608 ??   Ss 1:55 PM 0:00.02 postgres:stats collector process postgres   426 0.0 0.0 2654624 2208 ?? Ss 1:55 PM 0:00.02 postgres:   autovacuum launcher process postgres 425 0.0 0.0   2646300 764 ?? Ss 1:55 PM 0:00.03 postgres:沃尔夫作家   post postgres 424 0.0 0.0 2638108 1608 ?? SS   下午1:55 0:00.07 postgres:作家流程postgres 423
  0.0 0.0 2638108 836 ?? Ss 1:55 PM 0:00.00 postgres:checkpointer process postgres 419 0.0 0.0 2493792
  500 ?? Ss 1:55 PM 0:00.00 postgres:logger process postgres   85 0.0 0.1 2638108 13844 ?? Ss 1:55 PM 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:35 PM
  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`

但我不明白这个命令。

指导表示赞赏。令人沮丧的早晨!

2 个答案:

答案 0 :(得分:7)

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

kill <pid>

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

有时,您会遇到一个真正陷入困境的流程,并且似乎无法响应SIGTERM。在这种情况下,您可以通过执行以下操作告诉kill命令执行一些(或者,您知道,很多):

kill -9 <pid>或等同于kill -KILL <pid>

这会向进程发送SIGKILL信号,其效果(通常)是OS立即将进程从运行队列中取出并停止它。 这通常会有点危险,因为它不会给程序带来改变&#34;清理&#34;或以任何合理的方式完成运行。它只是立即停止它。

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

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

作为额外的奖励,我发现this song使我无法忘记此命令的工作原理。

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

另一个注意事项:有时候杀死一个进程并不起作用,因为你需要杀死父进程,而不是某些工作人员处理它fork&#39;编辑。你可以看到这个过程&#34; heirarchy&#34; (即父/子关系)使用命令ps axjf。您可以在man page(本地计算机上的ps)中查看有关man ps命令的详细信息。与kill一样,ps命令非常标准,因此文档应该主要适用于所有类似UNIX的操作系统。

答案 1 :(得分:6)

或者,我发现这answer解决了我的问题。

杀死所有名为“postgres&#39;

的流程
pkill postgres