查找并终止正在使用串口的进程

查找并终止正在使用串口的进程

我有多个串行端口,每个端口都连接了设备。它们被列为/dev/ttyUSB*.现在,我需要确保在运行脚本之前使用 python 脚本没有其他进程正在使用其中的任何一个kermit(以便访问不会被拒绝)login_init。我尝试pslsof命令。lsof给出以下输出:

sof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
  Output information may be incomplete.
COMMAND     PID        USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
login_ini 13395       user4    4u   CHR  188,9      0t0  512 /dev/ttyUSB9
python    14410       user4    6u   CHR  188,9      0t0  512 /dev/ttyUSB9

我得到了pid进程的 s,但是当我发出命令时killall,它说没有找到进程,如下所示:

user4@user-pc-4:~/Scripts$ killall -9 13395
13395: no process found

user4@user-pc-4:~/Scripts$ killall -9 14410
13395: no process found

这是正确且唯一的方法还是有更好的方法?

答案1

killall需要程序名称的子字符串作为参数。要通过进程 ID 终止进程,请使用kill.

您可以使用命令直接杀死所有打开文件的进程fuser

fuser -k /dev/ttyUSB9

答案2

由于您已经有了进程 ID,因此您可以使用kill,即

kill -TERM 13395 14410 

(我建议SIGTERM先发送一个普通的,然后再按SIGKILL- 按钮。)

killallLinux系统中使用的命令通过杀死进程姓名,就像pkill。但是,在其他系统(例如 Solaris)上,killall杀死一切(作为关闭程序的一部分),如果您曾经使用过它们,请记住这一点。

答案3

使用下面的命令来杀死pid

sudo kill -9 13395

sudo kill -9 14410

如果您想在单个命令中杀死所有(/dev/ttyUSB9),请使用以下命令

sudo pkill -9 ttyUSB9

要列出正在运行的进程 ID,请使用以下命令

ps -ef | grep ttyUSB9

要列出正在运行的进程 id.then 的数量,请使用以下命令

ps -ef | grep ttyUSB9 | wc -l

答案4

我很长一段时间以来一直sudo fuser -k成功地做到这一点,而且效果很好,但突然间我的命令被锁定,我什至无法使用 ctrl-C 来杀死它。

这是我的替代free_serial脚本:

# expects serial port string as command line argument
# run with sudo if needed:
# sudo free serial /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AI06HY2F-if00-port0

TTY_NAME=$(ls -l $0 | grep -o '[^/]*$')
#echo $TTY_NAME

#https://unix.stackexchange.com/questions/308866/how-to-find-processes-using-serial-port

PID=$(ls -l /proc/[0-9]*/fd/* 2> /dev/null |grep /dev/ | grep $TTY_NAME | grep -o 'proc/.*' | cut -d "/" -f2  2> /dev/null) 

if [ "$PID" ]; then
    echo "killing $PID"
    kill -KILL $PID
    echo done
fi

相关内容