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