Bash: Keine Jobsteuerung in dieser Shell


8

Ich habe ein minimales Linux-System.

init ist /bin/bash, nur ein Minimum an Bibliotheken in /lib/, /dev/ist statisch gefüllt, keine Daemons laufen (kein udev, ..)

Wenn die Bash startet, wird folgende Fehlermeldung angezeigt:

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

Wenn ich mit strace anfange, erhalte ich folgende Ausgabe:

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

Es sieht so aus, als ob Bash nicht geöffnet werden kann /dev/tty. Aber /dev/ttyexistiert in /dev/und hat die richtigen Berechtigungen:

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

Warum kann nicht bashgeöffnet werden /dev/tty? Und was bedeutet der ENXIOFehler?

Antworten:


4

init ist /bin/bash

Wie ich bereits unter https://unix.stackexchange.com/a/197472/5132 sagte , werden init=/bin/shkeine "API" -Dateisysteme bereitgestellt, es stürzt auf ungünstige Weise ab, ohne dass der Cache geleert wird, wenn einer eingegeben wirdexit ( https: //unix.stackexchange) .com / a / 195978/5132 ) und überlässt es im Allgemeinen dem (Super-) Benutzer, die Aktionen, die das System minimal nutzbar machen, manuell auszuführen.

Eine dieser Aktionen (wenn Sie wie anscheinend eine Jobsteuerungs-Shell verwenden möchten) ist die Anschaffung eines steuernden Terminals . /dev/ttyist kein tatsächliches Endgerät. Es ist ein Gerät, das zu dem Steuerungsterminal des Öffnungsprozesses umleitet. Wenn es keinen hat , da Prozess Nr. 1 zunächst nicht beginnt (und normalerweise die ganze Zeit, wenn ein echtes Systemmanagerprogramm als Prozess Nr. 1 ausgeführt wird), schlägt das Öffnen des Geräts fehl.

Ihr System ist zu minimal. Sie müssen ein Programm ausführen, das ein steuerndes Terminal einrichtet, eine ordnungsgemäße Sitzung initialisiert und wahrscheinlich einige der absoluten Minima der Systemverwaltung ausführt, z. B. das ordnungsgemäße und saubere Herunterfahren, mit dem dann Ihre Jobsteuerungs-Shell ausgeführt wird.

Weiterführende Literatur


Vielen Dank. Könnten Sie bitte erläutern, wie ich "ein steuerndes Terminal einrichten / steuerndes Terminal erwerben" kann?
Martin Vegter

@MartinVegter Verwenden Sie die Init von BusyBox.
Gilles 'SO - hör auf böse zu sein'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.