linux - centos 7 用脚本替换systemd

标签 linux bash console init systemd

我想做以下事情:我想用 脚本 替换我的 CentOS 7 安装上的 systemd 程序,即最终将启动一个 shell,用户可以在其中以 root 身份在系统控制台上输入命令。

为此,我使用了 init=/sbin/myInit 参数。在这个脚本中我做了一些初始化,最后我调用了 bash 让用户输入命令。交互式 bash 总是出现在屏幕上。

不幸的是,输入有问题,我一直没能解决:输入不能正常工作。当我按下 enter 键时,只有第二个 enter 有效,但屏幕上没有换行。当我键入一些字符时,并非所有字符都被读取。控制台似乎处于某种 Unicode 模式(stty -a 显示 iutf8 参数),bash 无法正确读取输入。输出很好,我脚本中的所有 echo 命令都正确打印在屏幕上(我只打印 ASCII 字符)。

我尝试了各种组合,具有不同的 LC_ALL 设置(LC_ALL=CLC_ALL=C.utf-8、没有 LC_ALLLANG 变量初始化),将 stdin/stdout/stderr 重定向到 /dev/console/dev/tty0/dev/tty1TERM 变量被初始化为 linux 值,但没有任何作用。我尝试了 unicode_startunicode_stop 命令,但 unicode_stop 不起作用,我收到错误消息“stty:标准输入:无法执行所有请求的操作”。如果我运行 showkey 命令并按下回车键,则会检测到正确的键码 28,与正常启动相同。

比这更奇怪的是,如果我使用 init=/bin/bash 内核参数,输入工作正常,如果我手动运行我的脚本,它也工作正常.如果我将 bash 可执行文件复制到类似 /bin/mys 的位置,并且我使用 init=/bin/mys,则会出现相同的输入问题。似乎 initrd 镜像对 /bin/bash 的处理方式不同。也许它执行一些初始化或其他操作,使 bash 能够从终端正确读取。为什么我们在 init=/bin/bashinit=/bin/mys 之间有这种区别?它最终是相同的可执行文件。

我做错了什么?

作为关于 init 程序的一般性问题,有人可以解释一下 init 程序应该做什么才能正常工作吗?它必须响应的任何特定信号,要执行的任何控制台初始化?

几天来我一直在努力解决这个问题,但我找不到任何解决方案。在网上我找不到任何关于此的文章。所以任何建议将不胜感激。谢谢。

最佳答案

我设法为此找到了解决方案。

事实证明,在启动时,控制台没有初始化。我查看了正常启动和脚本启动(init=/sbin/myInit)的stty -a输出之间的差异,它们之间存在一些差异: 正常启动时控制台上有以下事件标志:brkint ignpar ixon imaxbell isig icanon iexten echo,而在脚本启动时,这些标志被清除(stty 用 - 报告它们)。我不确定它们是什么意思,除了我很快注意到的 echo 标志,因为在每次按键时,屏幕上没有打印任何字符。

所以我决定在/dev/console 的初始化脚本中设置这些标志。翻阅 stty 手册页后,我找到了 sane 选项,它为正常的控制台使用设置了最重要的标志。所以我在我的初始化脚本中添加了 stty -F/dev/console sane 行。

但是,有一个小问题。如果控制台已被某个进程打开,则某些控制台选项似乎无法通过 stty 命令更改。因此,我在脚本中做的第一件事是通过 0/dev/null< 行将 stdin/stdout/stderr 重定向到 /dev/null/em>,然后添加 stty sane 行,然后将 stdin/stdout/stderr 重定向回 /dev/console

我还注意到一个名为 plymouth 的进程,它可能是由 CentOS initrd 启动的,所以在挂载 root 并执行 init 脚本之前。我不确定该进程是否打开了系统控制台,但我决定通过从 dracut 中省略 plymouth 模块来重建个性化的 initrd 来消除它(选项 -o plymouth)。

这样做之后,脚本运行正常,脚本启动的bash进程可以正确读取控制台。

希望有一天这对某人有所帮助。干杯

关于linux - centos 7 用脚本替换systemd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52178920/

相关文章:

linux - 使用 bash 脚本检查目录中的文件?这段代码有什么问题?

linux - Bash 从 XML 中读取和解析

regex - 当一个模式是 bash/awk 中的变量时如何在两种模式之间取线(动态正则表达式)

javascript - 在制作多人游戏时,我是否依赖浏览器不向玩家提供变量(这样他就可以破解)?

c# - 在屏幕左下角放置一个小的控制台窗口?

c - 在内核中添加中断服务例程

linux - 如何为 mvn 临时更改 JDK 版本

node.js - nodejs - 无法在linux服务器中写入文件

linux - 如何使用 shell 脚本删除 CSV 文件中多行中常见的特定字符串?

C# 如何使用参数读取控制台输出