【问题标题】:Unix Background process STOPPED abnormallyUnix后台进程异常停止
【发布时间】:2012-05-14 17:37:41
【问题描述】:

我使用以下命令在后台执行了一个 perl 脚本

nohup perl myPerlSCript.pl >debug_log &

几分钟后我得到了状态

[1]+ 已停止

我没想到它会停止,我也不知道是什么停止了它。我该如何调试它并找出它停止的原因?我实际上有兴趣了解要调试的 unix 命令。

【问题讨论】:

    标签: unix process background nohup


    【解决方案1】:

    有几种方法可以停止在后台运行的进程。所有这些都涉及以下信号之一:

    • SIGSTOP
    • SIGTSTP
    • SIGTTOU
    • SIGTTIN

    SIGSTOP 很严重。它是不可阻挡、不可忽视、不可处理的。就像SIGKILL 会杀死它一样,它肯定会停止该过程。其他的可以由后台进程处理,防止停止。

    • 信号由另一个进程使用kill(2) 发送,或由该进程使用raise(3)kill(2) 发送给自身
    • 进程尝试写入终端,并且终端选项tostop 已启用(请参阅stty -a 的输出)。这会生成SIGTTOU
    • 进程尝试使用tcsetattr(3) 或等效的ioctl 更改终端模式。 (这些与stty 显示的模式相同。)无论tostop 标志的当前状态如何,这都会生成SIGTTOU
    • 进程试图从终端读取。这会生成SIGTTIN

    这个列表可能很不完整。

    【讨论】:

    • 谢谢 - 是否有可能看到这些信号中的哪一个至少导致了[1]+ Stopped
    • 在 zsh 而不是 bash 中运行它,它会给你一个更详细的信息。 bash 为所有 4 个打印“已停止”。
    【解决方案2】:

    您是否正在使用 tcsh? Tcsh 实际上带有一个内置的 nohup 命令,我之前遇到过很多问题,看到了你所看到的确切行为。

    如果是这种情况,请尝试直接使用/usr/bin/nohup

    【讨论】:

    • 不,我没有使用 tcsh。这是 bash。