1

Я настроил службу linux (CentOS) для запуска скрипта, который запускается в backgroud (daemon /home/user/testftp.sh &) или в контексте службы start и stop:

# 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
}

Моя проблема - остановить все процессы. killproc $prog остановит службу, но фоновый процесс все еще работает (testftp.sh), который необходимо запустить в фоновом режиме для мониторинга журналов ftp).

Я видел похожие посты, в которых говорится, что нужно использовать PID1=$! который будет представлять PID для testftp.sh . Но PID, похоже, просто сервисный ftpmonitor . Поэтому очевидно, что моя команда stop service с kill $PID1 не будет работать.

РЕДАКТИРОВАТЬ:

скрипт 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/\[\(.*\)\]/\1/')
    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

1 ответ1

2

Вы должны быть в состоянии убить его, используя один или все из них:

  • killall testftp.sh

  • kill $(pgrep testftp.sh)

  • pkill testftp.sh

Если ваш скрипт запускает другие процессы и вы хотите убить его и всех его потомков, используйте pkill -P:

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

Поэтому вместо kill $PID1 используйте

pkill -P $PID1

В качестве альтернативы, вы можете попробовать

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

Этот вопрос о SO имеет несколько хороших указателей.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .