我和这家伙我以为是某个进程导致 bash 挂起,但实际上它只是花了一段时间。我运行了gem install berkshelf
,幸运的是,该进程显示在活动监视器上,所以我知道它仍在运行,但有没有更可靠的方法来做到这一点?
答案1
实际上,你无法区分进程挂起和“只是花了一点时间”。进程能响应信号,但没有有到。
当进程“挂起”时,它可能陷入了无限循环,或者在等待某个永远不会发生的事件。但它也可能只是做了很多工作。
例如,执行密集工作的进程可能不会立即对Ctrl-C(SIGINT
终止信号)做出反应,但可能会稍后退出,甚至根本不退出。这通常是您发送 的情况SIGKILL
,进程无法忽略它。
请注意,在整个情况下,实际的 shell(例如 Bash)永远不会挂起。简而言之,shell 只是执行进程并将其置于前台。您仍然可以暂停该进程并继续在后台运行它(Ctrl-Z,然后bg
)。您的 shell 仍将正常工作。
答案2
一个好办法是在详细模式下运行需要很长时间的进程。这样你可以看到进度,如果挂起,你就知道问题出在哪里,并(希望)能够解决问题。此外,(默认情况下,使用stty sane
)Ctrl+C发送SIGINT
,但Ctrl+Z发送SIGTSTP
。