bash:此shell中无作业控制


8

我有一个最小的Linux系统。

init是/bin/bash,仅库中的最少数量/lib//dev/静态填充,没有运行的守护进程(无udev的,..)

当bash开始时,出现以下错误:

bash: cannot set terminal process group (-1) inappropriate ioctl for device
bash: no job control in this shell

当我使用strace启动bash时,得到以下输出:

rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
open("/dev/tty", O_RDWR|O_NONBLOCK)     = -1 ENXIO (No such device or address)
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

....

readlink("/proc/self/fd/0", "/dev/console"..., 4095) = 12
stat("/dev/console", {st_mode=S_IFCHR|0600, st_rdev=makedev(5, 1), ...}) = 0
open("/dev/console", O_RDWR|O_NONBLOCK) = 3

看起来好像bash无法打开/dev/tty。但/dev/tty存在于其中/dev/并具有正确的权限:

ll /dev/tty*
crw-rw-rwT 1 root root 5, 0  2014-Sep-29  23:39:47  dev/tty
crw------T 1 root root 4, 0  2015-Dec-23  20:10:18  dev/tty0
crw------T 1 root root 4, 1  2015-Dec-23  20:10:18  dev/tty1

为什么不能bash打开/dev/tty?又是什么的ENXIO错误是什么意思?

Answers:


4

初始化是 /bin/bash

正如我在https://unix.stackexchange.com/a/197472/5132上所说的那样,init=/bin/sh没有安装“ API”文件系统,当一种类型exithttps://unix.stackexchange .com / a / 195978/5132),通常将其留给(超级)用户来手动执行使系统使用最少的操作。

这些操作之一(如果您要使用作业控制外壳,如您显然想要的那样)是获取控制终端/dev/tty不是实际的终端设备。这是一种可以重定向到任何打开过程的控制终端的设备。如果它没有一个,因为进程#1不会开始(通常是在整个真实的系统管理程序作为进程#1运行的所有时间),因此打开设备失败。

您的系统太小了。您需要运行一个程序来设置控制终端,初始化适当的会话,并可能执行一些系统管理的最低要求,例如正确,干净地关闭系统,然后运行您的作业控制外壳。

进一步阅读


谢谢。您能否详细说明我如何“设置控制终端/获取控制终端”?
Martin Vegter 2015年

@MartinVegter使用BusyBox的init。
吉尔斯(Gillles)“所以-别再邪恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.