kill process no script externo executado como um serviço

1

Eu configurei um serviço do linux (CentOS) para executar um script que é executado no backgroud ( daemon /home/user/testftp.sh & ) ou no contexto do serviço de início e parada:

# Source function library.
. /etc/init.d/functions

prog=ftpmonitor
lockfile=/var/lock/subsys/ftpmonitor

start() {
        [ "$EUID" != "0" ] && exit 4

        # Start daemons.
        echo -n $"Starting $prog: "
        daemon /home/user/testftp.sh &
        PID1=$!
        #echo "$PID1"
        RETVAL=$?
        echo

        [ $RETVAL -eq 0 ] && touch $lockfile
        return $RETVAL
}

stop() {
        [ "$EUID" != "0" ] && exit 4
        echo -n $"Shutting down $prog: "
        killproc $prog
        kill $PID1
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $lockfile
        return $RETVAL
}

Meu problema é parar todos os processos. killproc $prog parará o serviço, mas o processo de segundo plano ainda está em execução ( testftp.sh ), que precisa ser executado no segundo plano para monitorar logs de ftp).

Eu vi postagens semelhantes que dizem usar PID1=$! , o que representaria o PID para testftp.sh . Mas o PID parece ser apenas o serviço ftpmonitor . Então, obviamente, meu comando stop service com kill $PID1 não funcionará.

EDITAR :

script testftp.sh

#!/bin/sh

sudo tail -F /var/log/vsftpd.log | while read line; do
  if sudo echo "$line" | grep -q 'OK UPLOAD:'; then
    username=$(echo "$line" | cut -d" " -f8 | sed 's/\[\(.*\)\]//')
    filename=$(echo "$line" | cut -d, -f2 | sed 's/^[ \t]*//' | tr -d '"')
    home="/home/vsftpd/$username"
    if sudo ls "$home$filename" &> /dev/null; then
      # do something with $filename
        echo "$home$filename is the file to be proccesed"
    fi
  fi
done
    
por Tom 30.03.2013 / 16:28

1 resposta

2

Você deve conseguir eliminá-lo usando um ou todos os seguintes:

  • killall testftp.sh

  • kill $(pgrep testftp.sh)

  • pkill testftp.sh

Se o seu script estiver iniciando outros processos e você quiser eliminá-lo e a todos os seus filhos, use pkill -P :

-P ppid,... 
    Only match processes whose parent process ID is listed.

Então, em vez de kill $PID1 , use

pkill -P $PID1

Como alternativa, você pode tentar

kill -- -$(ps opgid= $PID)

Esta questão em SO tem alguns bons indicadores.

    
por 30.03.2013 / 16:44