직렬 포트를 사용하여 프로세스 찾기 및 종료

직렬 포트를 사용하여 프로세스 찾기 및 종료

여러 개의 직렬 포트가 있고 장치가 각 포트에 연결되어 있습니다. 이제 스크립트를 실행하기 전에 python 스크립트를 사용하여 다른 프로세스가 이를 사용하고 있지 않은지 (액세스가 거부되지 않도록) /dev/ttyUSB*확인해야 합니다 . 해보고 주문 해 봅니다. 다음과 같은 출력을 제공합니다.kermitlogin_initpslsoflsof

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의 수를 나열하려면 다음 명령을 사용하십시오.

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

관련 정보