私はペアでマシンを持っています。それらは、ヌルモデムシリアルケーブルによって相互に接続されています。これらのマシンは時々ダウンし、それらを診断する唯一の方法は、ペアのもう一方のノードを使用して、そのケーブルを介することです。
これらのデバイスには、シリアルデバイスで実行するように設定されたGettyがあります/dev/ttyAMA0
。これはデフォルトであり、可能な限りデフォルトの設定に近づけたいと思います。
ここに問題があります:
Gettyにデバイスの制御を放棄させることができないようです。そのため、minicom
のようなものを使用して他のデバイスにログインできます。残念ながら、getty
を強制終了するだけでは機能しません。これは、何かがすぐに再起動するように見えるためです。
どうすればgetty
を停止させることができますか?
(ちなみに、「GeTTY」というつづりは見たことがありません。正しくないと思います。)
簡単に言うと、/etc/inittab
でコメントアウトし、init q
を実行して構成を再読み込みすることで、getty
を無効にできます。 systemdまたはUpstartを使用している場合を除きますが、指定していないため、使用していないと想定します。
より長い答えは、セットアップに本質的な問題があり、欠陥があるということです。 getty
が両方のシリアルポートで実行されている場合、2つのgetty
プロセスは、互いに無限にチャットを開始するリスクがあります。つまり、一方はプロンプトを送信し、もう一方はユーザー名として解釈します。これにより、元の側でユーザー名として解釈される独自のプロンプトが生成され、以下同様に永久に続きます。
これを処理する正しい方法は、各方向に1つずつ、2つのシリアルポートを使用することです。システム1のコンソールシリアルポートはシステム2の追加シリアルポートに接続され、システム2のコンソールシリアルポートはシステム1の追加シリアルポートに接続されます。両方のシステムの「追加」シリアルポートは実行されないため、getty
(コンソールシリアルポートのみが実行します)、無効にするgetty
はなく、ポートはscreen
またはcu
などで直接使用できます。
「追加」シリアルポートの場合、システムに十分な内蔵シリアルポートがない場合は、USBシリアルポートアダプターを使用できます。これらのポートは、システムが完全に起動された後にのみアクセスされるため(コンソールのシリアルポートとは異なり)、起動シーケンスの途中まで初期化されないUSBバス上にあることは問題ありません。
停止信号を送信できます。 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のように。
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