Estou trabalhando em um sistema rodando o Debian Wheezy com um aplicativo que, como parte de seu comportamento normal, gera alguns processos filhos. Na maioria das circunstâncias, quando o aplicativo pai é eliminado, ele limpa todos os seus filhos e sai. No entanto, quando eu desligo / reinicializo o computador fica travado por alguns minutos antes de desligar. A máquina é remota / sem cabeça, então o que eu vejo do meu lado é uma mensagem de que o sistema está indo para baixo, então minha sessão ssh será terminada e então eu terei erros de conexão recusada pelos próximos minutos quando eu tentar logar Quando eu passar por / var / log / syslog, veremos entradas como: %código% Para vários processos filho depois que a solicitação de reinicialização foi emitida, mas antes que o sistema seja realmente desativado.
Algo que pode estar relacionado é que, ocasionalmente, o aplicativo pai deixa um filho em execução depois que ele sai. Para facilitar a eliminação manual desses processos, eu tenho um script que consiste basicamente em:
#!/bin/bash
killall -q parent_process
killall -q child_1
killall -q child_2
#etc...
Quando executado manualmente, esse script elimina todos os processos e nunca trava. Além disso, nenhum dos processos filhos nunca travar / exibir esse comportamento se eles forem iniciados manualmente.
Meu instinto me diz que o problema é que o aplicativo pai não está limpando seus filhos corretamente, mas infelizmente o processo pai é um aplicativo interno proprietário que não posso alterar a implementação. Estou preso tentando encontrar uma solução alternativa. Se eu executar manualmente o meu script killall antes do desligamento / reinicialização, o desligamento nunca é atrasado, então estou tentando encontrar uma maneira de executar esse script no shutdown / reboot
Minha primeira tentativa foi simplesmente copiar meu script killall para o /etc/init.d e então vinculá-lo em rc0.d e rc6.d como K01killstuff, mas isso não funcionou, então eu decidi tentar escrever um script adequado. script de inicialização. Eu comecei a partir do esqueleto em /etc/init.d e descobri:
#! /bin/sh
### BEGIN INIT INFO
# Provides: killstuff
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Stop: 0 1 6
# Short-Description: Stop applications
# Description: This file should be used to construct scripts to be
# placed in /etc/init.d.
### END INIT INFO
# Author:
#
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Description of the service"
NAME=daemonexecutablename
DAEMON=/usr/sbin/$NAME
DAEMON_ARGS="--options args"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that stops the daemon/service
#
do_stop()
{
killall -q parent_process
killall -q child_1
killall -q child_2
}
case "$1" in
start)
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping Applications"
do_stop
;;
status)
;;
restart|force-reload)
;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
:
Eu testei o script com
[ 3840.402493] INFO: task child_process:4455 blocked for more than 120 seconds.
[ 3840.402579] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 3840.402684] child_process D c109bbf8 0 4455 3702 0x00000000
[ 3840.402691] f79c7b00 00000046 00000001 c109bbf8 f0bed5b0 333f9aaa 00000351 c1483b00
[ 3840.402703] c1483b00 00000292 c109bcf9 00000292 00000000 f2c005a0 00000000 edd1fd34
[ 3840.402714] 00000292 c109bebf c10abe25 00000001 f2bd4740 00000000 00000001 c109bc0a
[ 3840.402726] Call Trace:
[ 3840.402733] [] ? free_pages_prepare+0xc0/0xf1
[ 3840.402741] [] ? free_hot_cold_page+0x3d/0xf7
[ 3840.402749] [] ? __pagevec_free+0x3e/0x55
[ 3840.402756] [] ? page_address+0x1b/0x85
[ 3840.402763] [] ? free_pages_prepare+0xd2/0xf1
[ 3840.402771] [] ? __mutex_lock_common.isra.6+0x11d/0x132
[ 3840.402778] [] ? mutex_lock+0x15/0x21
[ 3840.402785] [] ? tty_release+0x3d/0x400
[ 3840.402794] [] ? ip_mc_del_src+0xf1/0x12e
[ 3840.402801] [] ? ip_mc_leave_src+0x22/0x68
[ 3840.402809] [] ? kmem_cache_free+0x23/0x55
[ 3840.402816] [] ? fput+0xd7/0x161
[ 3840.402822] [] ? filp_close+0x54/0x5a
[ 3840.402828] [] ? put_files_struct+0x4b/0x88
[ 3840.402834] [] ? do_exit+0x237/0x60d
[ 3840.402842] [] ? recalc_sigpending+0xf/0x2f
[ 3840.402849] [] ? dequeue_signal+0xb4/0x126
[ 3840.402855] [] ? do_group_exit+0x56/0x83
[ 3840.402863] [] ? get_signal_to_deliver+0x43b/0x465
[ 3840.402871] [] ? do_signal+0x32/0x52c
[ 3840.402879] [] ? update_rmtp+0x45/0x45
[ 3840.402886] [] ? do_futex+0x99/0x6c6
[ 3840.402893] [] ? read_tsc+0xa/0x28
[ 3840.402901] [] ? timekeeping_get_ns+0x10/0x47
[ 3840.402907] [] ? sys_futex+0xbb/0x10f
[ 3840.402915] [] ? do_notify_resume+0x1e/0x5c
[ 3840.402922] [] ? work_notifysig+0x13/0x1b
[ 3840.402929] [] ? start_cpu_timer+0x39/0x62
[ 3840.402935] [] ? vmstat_cpuup_callback+0x18/0x5a
e confirmei que ele matou todos os processos que eu esperava, depois executei /etc/init.d/killstuff stop
e vi que os links foram criados em rc0.d e rc6.d, mas o sistema ainda pendurado ao reinicializar. O que me leva a acreditar que esses processos precisam ser eliminados anteriormente na seqüência de encerramento
Então, quais são alguns outros lugares que eu poderia tentar invocar meu script de matar? Ou há coisas que eu poderia tentar além de matar todos os nossos aplicativos antes que o sistema seja desligado para tentar tornar as coisas mais próximas?