web-dev-qa-db-ja.com

ゲッティが所有するシリアルポートを解放する方法

私はペアでマシンを持っています。それらは、ヌルモデムシリアルケーブルによって相互に接続されています。これらのマシンは時々ダウンし、それらを診断する唯一の方法は、ペアのもう一方のノードを使用して、そのケーブルを介することです。

これらのデバイスには、シリアルデバイスで実行するように設定されたGettyがあります/dev/ttyAMA0。これはデフォルトであり、可能な限りデフォルトの設定に近づけたいと思います。

ここに問題があります:

Gettyにデバイスの制御を放棄させることができないようです。そのため、minicomのようなものを使用して他のデバイスにログインできます。残念ながら、gettyを強制終了するだけでは機能しません。これは、何かがすぐに再起動するように見えるためです。

どうすればgettyを停止させることができますか?

1
PythonNut

(ちなみに、「GeTTY」というつづりは見たことがありません。正しくないと思います。)

簡単に言うと、/etc/inittabでコメントアウトし、init qを実行して構成を再読み込みすることで、gettyを無効にできます。 systemdまたはUpstartを使用している場合を除きますが、指定していないため、使用していないと想定します。

より長い答えは、セットアップに本質的な問題があり、欠陥があるということです。 gettyが両方のシリアルポートで実行されている場合、2つのgettyプロセスは、互いに無限にチャットを開始するリスクがあります。つまり、一方はプロンプトを送信し、もう一方はユーザー名として解釈します。これにより、元の側でユーザー名として解釈される独自のプロンプトが生成され、以下同様に永久に続きます。

これを処理する正しい方法は、各方向に1つずつ、2つのシリアルポートを使用することです。システム1のコンソールシリアルポートはシステム2の追加シリアルポートに接続され、システム2のコンソールシリアルポートはシステム1の追加シリアルポートに接続されます。両方のシステムの「追加」シリアルポートは実行されないため、getty (コンソールシリアルポートのみが実行します)、無効にするgettyはなく、ポートはscreenまたはcuなどで直接使用できます。

「追加」シリアルポートの場合、システムに十分な内蔵シリアルポートがない場合は、USBシリアルポートアダプターを使用できます。これらのポートは、システムが完全に起動された後にのみアクセスされるため(コンソールのシリアルポートとは異なり)、起動シーケンスの途中まで初期化されないUSBバス上にあることは問題ありません。

1
Celada

停止信号を送信できます。 rまたは別のシグナルが送信されるまで、再起動しません。

Sudo kill -19 <pidOfGetty>

現在停止しているかどうかは、次の方法で確認できます。

ps a | grep getty

root       948  0.0  0.0   4656  2032 tty5     Ts+  Sep20   0:00 /sbin/getty -8 38400 tty5
root       958  0.0  0.0   4656  1880 tty2     Ss+  Sep20   0:00 /sbin/getty -8 38400 tty2

プロセス状態コードTは、停止していることを意味します。 tty5のプロセス948のように。

0
HYK

Tomaszの答えの問題は、gettyがおそらく何もしないというプロセスのpidを殺すことです。 inittabが通常gettyである「restart」に設定されている場合、それを強制終了できたとしても、Linuxはそれを再起動します。

1つの解決策は、inittab行をコメントアウトすることです。

#AMA0:12345:respawn:/bin/start_getty 115200 ttyAMA0 vt102

次に、initプロセスにinittabを更新するように指示します。

kill -HUP 1

これが完了したら、次のスクリプトを使用して正しいプロセスを強制終了できます。

for pid in $(ls -l /proc/[0-9]*/fd/* | grep /dev/ttyAMA0 | awk '{ print $9 }' | awk -F/ '{ print $3 }'); do
    echo "killing $pid"
    kill -9 $pid
done

これでポートが解放され、シリアルポートとして使用できるようになります。

ポートを解放するために強制終了する必要のあるpidを簡単に把握するには、次のように入力します。

ls -l /proc/[0-9]*/fd/* | grep /dev/ttyAMA0
0
superzanti