Ho uno script per uccidere un albero del processo che funziona bene in linux ma sto vivendo un comportamento strano su osx. Funziona davvero bene con i miei test unitari e anche quando provo ad eseguirlo manualmente su osx, ma per qualche ragione quando viene eseguito come un lavoro jenkins agisce in modo diverso.
Quindi questa è la funzione di bash corrente con un po 'di debug echo e sleeps:
killtree() {
local _pid=$1
local _sig=${2:--TERM}
echo "Stopping ${_pid}"
sleep 1
kill -stop ${_pid} # stop parent to avoid creation of new children
children='pgrep -P ${_pid}'
echo "Children=$children"
sleep 1
for _child in $children; do
killtree ${_child} ${_sig}
done
echo "Killing child ${_pid}"
sleep 1
kill -${_sig} ${_pid}
}
La chiamata a pgrep che da una corsa fallita può essere pgrep -P 9651
stampa tutti i processi sulla macchina, e gli script si bloccano quando tenta di uccidere pid 0.
Ma perché otterrebbe tutti i processi? Al termine dell'esecuzione, il processo 9651 è ancora in esecuzione e se si esegue il comando sulla riga di comando pgrep -P 9651
non viene generato alcun output (il che è previsto poiché questo processo non dovrebbe avere figli).
Ho aggiunto una chiamata di debug per stampare la struttura del processo subito prima di elencare i bambini:
+ pstree='-+= 00001 root /sbin/launchd
\-+= 09774 root /usr/sbin/sshd -i
\-+- 09777 jenkins /usr/sbin/sshd -i
\-+= 09783 jenkins bash -c cd '\''/var/jenkins'\'' && java -jar slave.jar
\-+- 09784 jenkins /usr/bin/java -jar slave.jar
\-+- 09807 jenkins /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/jre/bin/java -classpath/
\-+- 09817 jenkins /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/jre/bin/java -
\--- 09828 jenkins sleep 10'
Mi sembra normale, il sleep 10
non ha figli.
Qualche idea - Sono un po 'bloccato dopo aver provato a eseguire il debug di questo per alcune ore?
Il processo che sta tentando di essere ucciso è in questo caso un semplice sleep 10
utilizzato per il test.