bash:このシェルにはジョブ制御がありません


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エラーはどういう意味ですか?

回答:


4

initは /bin/bash

https://unix.stackexchange.com/a/197472/5132で言ったように、init=/bin/sh「API」ファイルシステムがマウントされず、1つのタイプexithttps://unix.stackexchange .com / a / 195978/5132)、および一般に、システムを最小限にしか使用できないようにするアクションを手動で実行する(スーパー)ユーザーに任せます。

これらのアクションの1つ(明らかにジョブコントロールシェルを使用したい場合)は、制御端末の取得です。 /dev/ttyは実際の端末デバイスではありません。これは、開始プロセスの制御端末が何であるかにリダイレクトするデバイスです。それは場合は1を持っていません(実際のシステム管理プログラムは、プロセス#1として実行されている場合、通常はすべての時間の中で)、デバイスが故障したオープニング、そもそもないプロセス#1として、。

あなたのシステムはあまりにも最小限です。制御端末をセットアップし、適切なセッションを初期化するプログラムを実行する必要があり、おそらく適切かつ完全にシャットダウンするなど、システム管理の最小限の機能をいくつか実行してから、ジョブ制御シェルを実行します。

参考文献


ありがとう。「管理端末の設定・管理端末の取得」について詳しく教えてください。
Martin Vegter、2015

@MartinVegter BusyBoxのinitを使用します。
Gilles「SO-邪悪なことをやめよう」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.