终止作为服务运行的外部脚本的进程

终止作为服务运行的外部脚本的进程

daemon /home/user/testftp.sh &我已经设置了一个 Linux(CentOS)服务来运行在后台( )或在启动和停止服务上下文中运行的脚本:

# 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。所以显然我的停止服务命令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

你应该能够使用其中一个或全部方法来杀死它:

  • 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 上有一些很好的指示。

相关内容