如何释放 Getty 拥有的串行端口

如何释放 Getty 拥有的串行端口

我有成对的机器。它们通过零调制解调器串行电缆相互连接。这些机器有时会出现故障,诊断它们的唯一方法是通过该电缆,使用该对中的另一个节点。

这些设备已将 Getty 配置为在串行设备上运行/dev/ttyAMA0。这是默认情况下的,我想尽可能接近默认配置。

问题是这样的:

我似乎无法让 Getty 放弃对设备的控制,因此我可以使用类似的东西minicom来登录另一台设备。不幸的是,简单地杀死它getty不起作用,因为似乎有什​​么东西会立即重新启动它。

我怎样才能getty停下来?

答案1

(顺便说一句,我从未见过拼写“GeTTY”。我认为它不正确。)

简而言之,您可以getty通过注释掉它/etc/inittab并运行init q以重新读取配置来禁用它。除非你使用的是 systemd 或 Upstart,但既然你没有这么说,我就假设你不是。

更长的答案是您的设置存在固有问题并且存在缺陷。在getty两个串行端口上运行时,这两个getty进程面临着开始无休止地互相聊天的风险。也就是说,一个将发送一个提示,另一个将其解释为用户名,这会导致它产生自己的提示,该提示在原始端被解释为用户名,如此循环下去。

处理此问题的正确方法是使用两个串行端口,每个方向一个。系统 1 上的控制台串行端口连接到系统 2 上的额外串行端口,系统 2 上的控制台串行端口连接到系统 1 上的额外串行端口。由于两个系统上的“额外”串行端口从未运行getty(只有控制台串行端口可以),永远不会getty禁用,并且该端口可以直接被screencu等使用...

对于“额外”串行端口,如果系统没有提供足够的内置串行端口,您可以使用 USB 串行端口适配器。因为这些端口只有在系统完全启动后才能访问(与控制台串行端口不同),所以它们可以位于 USB 总线上,而 USB 总线只有在启动顺序进行到一半时才会被初始化。

答案2

您可以发送停止信号。它不会重新启动,直到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 一样。

答案3

Tomasz 的答案的问题在于,杀死显示 getty 的进程的 pid 可能不会执行任何操作。如果你的 inittab 设置为“重新启动”(通常是通过 getty 进行的),那么即使你确实设法杀死它,linux 也会重新启动它。

一种解决方案是注释掉 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

相关内容