我有多个串行端口,每个端口都连接了设备。它们被列为/dev/ttyUSB*
.现在,我需要确保在运行脚本之前使用 python 脚本没有其他进程正在使用其中的任何一个kermit
(以便访问不会被拒绝)login_init
。我尝试ps
并lsof
命令。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
- 按钮。)
这killall
Linux系统中使用的命令通过杀死进程姓名,就像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