Process

執行不同 PID 的 2 個相同程序 - 未執行緒化

  • February 15, 2021

這不是一個多執行緒程序。和我觀察到pstop

[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 像這樣執行 2 個相同的程序,特別是當它的 init 腳本應該已經考慮到這一點時,並且/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}" user@example.com
   fi

ps對於那個 cron 作業顯示為<defunct>.

我想知道這是否以某種方式導致該程序執行兩次。

某些東西(或不止一件事)似乎已經執行了該程序兩次。

嘗試ps ax -o ppid,pid,lstart,cmd獲取程序的開始時間。並蒐索可能啟動它的腳本。

另請查看父程序 ID。

引用自:https://unix.stackexchange.com/questions/634590