여러 개의 직렬 포트가 있고 장치가 각 포트에 연결되어 있습니다. 이제 스크립트를 실행하기 전에 python 스크립트를 사용하여 다른 프로세스가 이를 사용하고 있지 않은지 (액세스가 거부되지 않도록) /dev/ttyUSB*
확인해야 합니다 . 해보고 주문 해 봅니다. 다음과 같은 출력을 제공합니다.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의 수를 나열하려면 다음 명령을 사용하십시오.
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