我有成对的机器。它们通过零调制解调器串行电缆相互连接。这些机器有时会出现故障,诊断它们的唯一方法是通过该电缆,使用该对中的另一个节点。
这些设备已将 Getty 配置为在串行设备上运行/dev/ttyAMA0
。这是默认情况下的,我想尽可能接近默认配置。
问题是这样的:
我似乎无法让 Getty 放弃对设备的控制,因此我可以使用类似的东西minicom
来登录另一台设备。不幸的是,简单地杀死它getty
不起作用,因为似乎有什么东西会立即重新启动它。
我怎样才能getty
停下来?
答案1
(顺便说一句,我从未见过拼写“GeTTY”。我认为它不正确。)
简而言之,您可以getty
通过注释掉它/etc/inittab
并运行init q
以重新读取配置来禁用它。除非你使用的是 systemd 或 Upstart,但既然你没有这么说,我就假设你不是。
更长的答案是您的设置存在固有问题并且存在缺陷。在getty
两个串行端口上运行时,这两个getty
进程面临着开始无休止地互相聊天的风险。也就是说,一个将发送一个提示,另一个将其解释为用户名,这会导致它产生自己的提示,该提示在原始端被解释为用户名,如此循环下去。
处理此问题的正确方法是使用两个串行端口,每个方向一个。系统 1 上的控制台串行端口连接到系统 2 上的额外串行端口,系统 2 上的控制台串行端口连接到系统 1 上的额外串行端口。由于两个系统上的“额外”串行端口从未运行getty
(只有控制台串行端口可以),永远不会getty
禁用,并且该端口可以直接被screen
或cu
等使用...
对于“额外”串行端口,如果系统没有提供足够的内置串行端口,您可以使用 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