2 个具有不同 PID 的相同进程正在运行 - 非线程化

2 个具有不同 PID 的相同进程正在运行 - 非线程化

这不是一个多线程进程。ps我观察到top

[user@host]$ ps aux | grep -i [r]redacted                                                                                                                                                                                                                                                
500       3073  6.1 11.7 1457148 188188 ?      Sl   Feb14  91:54 /usr/bin/python2.7 /usr/bin/redacted_proc
500       3120  6.1 11.0 1541952 177184 ?      Sl   Feb14  91:56 /usr/bin/python2.7 /usr/bin/redacted_proc


top - 10:02:55 up 728 days, 19:30,  3 users,  load average: 0.26, 0.14, 0.14
Tasks:  99 total,   1 running,  97 sleeping,   0 stopped,   1 zombie
Cpu(s):  3.7%us,  1.0%sy,  0.0%ni, 95.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.1%st
Mem:   1598640k total,  1239756k used,   358884k free,   192296k buffers
Swap:        0k total,        0k used,        0k free,   346756k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                                                         
 3120 redacted  20   0 1505m 173m 4648 S 10.3 11.1  93:33.08 redacted_proc                                                                                                                                                                                                                                                     
 3073 redacted  20   0 1422m 185m 4608 S  6.6 11.9  93:31.04 redacted_proc

由于杀死了两个 PID 并正常启动了进程,因此该进程再次有一个正在运行的 PID。

什么原因导致 Linux 运行两个相同的进程,尤其是当它的初始化脚本应该已经考虑到这一点,而下面/var/run/redacted.pid只存在一个条目时?

我包括初始化脚本的内容:

#!/bin/bash
# Source function library.
. /etc/rc.d/init.d/functions

RETVAL=0
DAEMON=redacted_process
BIN="/usr/bin/redacted_process"
OPTS=""
RUNAS=redacted
PIDDIR=/var/run/${DAEMON}
PIDFILE=${PIDDIR}/${DAEMON}.pid

start () {
    echo -n "Starting ${DAEMON}: "
    [ -f ${PIDFILE} ] && success && echo && return 0
    su -s /bin/bash ${RUNAS} -c "
        cd /
        ${BIN} ${OPTS} &> /dev/null &
        echo \$! > ${PIDFILE}
        disown \$!
    "
    RETVAL=$?
    [ $RETVAL -eq 0 ] && success || failure
    echo
    return $RETVAL
}

stop () {
    echo -n "Shutting down ${DAEMON}: "
    killproc ${DAEMON}
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/${DAEMON}
    [ $RETVAL -eq 0 ] && rm -f ${PIDFILE}
    return $RETVAL
}

restart () {
    stop
    start
    RETVAL=$?
    return $RETVAL
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart|reload)
        restart
        ;;
    status)
        status ${DAEMON}
        RETVAL=$?
        ;;
    *)
        echo "Usage: ${0} {start|stop|restart|status}"
        RETVAL=1
esac

exit $RETVAL

/etc/crontab这很有趣,这个作业还有一个每分钟运行的条目:

    /sbin/service redacted status > /dev/null
    if [ "$?" -gt "0" ]; then
        /bin/rm /var/run/redacted_proc/*
        /sbin/service redacted restart && tail -n 200 /var/log/redacted_proc/redacted_prod.log | mail -s "redacted pid restarted on ${HOSTNAME}" [email protected]
    fi

对于ps该 cron 作业显示为<defunct>.

我想知道这是否以某种方式导致该程序运行两次。

答案1

有些东西(或不止一件事)似乎运行了该程序两次。

尝试ps ax -o ppid,pid,lstart,cmd获取进程的启动时间。并搜索可能启动它的脚本。

另请查看父进程 ID。

相关内容