シリアルポートを使用したプロセスの検索と終了

シリアルポートを使用したプロセスの検索と終了

複数のシリアルポートがあり、デバイスが各ポートに接続されています。スクリプトを実行する前に、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

私の代替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

関連情報