bash: pas de contrôle des travaux dans ce shell

8

J'ai un système Linux minimal.

init est /bin/bash, seulement le strict minimum de bibliothèques dans /lib/, /dev/est rempli statiquement, aucun démon en cours d'exécution (pas d'udev, ..)

Lorsque bash démarre, j'obtiens l'erreur suivante:

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

Lorsque je démarre bash avec strace, j'obtiens la sortie suivante:

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

Il semble que bash ne puisse pas s'ouvrir /dev/tty. Mais /dev/ttyexiste dans /dev/et dispose des autorisations correctes:

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

Pourquoi ne peut pas bashouvrir /dev/tty? Et que signifie l' ENXIOerreur?

Martin Vegter
la source

Réponses:

4

init est /bin/bash

Comme je l'ai dit à https://unix.stackexchange.com/a/197472/5132 , les init=/bin/shsystèmes de fichiers "API" ne sont pas montés, se bloque de manière disgracieuse sans vidage du cache lorsqu'un type exit ( https: //unix.stackexchange .com / a / 195978/5132 ), et laisse généralement au (super) utilisateur le soin d'effectuer manuellement les actions qui rendent le système utilisable de façon minimale.

L'une de ces actions (si vous souhaitez utiliser un shell de contrôle des tâches, comme vous le faites apparemment) consiste à acquérir un terminal de contrôle . /dev/ttyn'est pas un véritable terminal. C'est un appareil qui redirige vers le terminal de contrôle du processus d'ouverture. S'il n'en a pas , comme le processus n ° 1 ne commence pas (et généralement tout le temps lorsqu'un véritable programme de gestionnaire de système est exécuté en tant que processus n ° 1), l'ouverture du périphérique échoue.

Votre système est trop minimal. Vous devez exécuter un programme qui configure un terminal de contrôle, initialise une session appropriée et effectue probablement certains des minima de gestion du système tels que l'arrêt correct et propre, qui exécute ensuite votre shell de contrôle des travaux.

Lectures complémentaires

JdeBP
la source
Merci. Pourriez-vous expliquer comment je peux «configurer un terminal de contrôle / acquérir un terminal de contrôle»?
Martin Vegter du
@MartinVegter Utilisez l'init de BusyBox.
Gilles 'SO- arrête d'être méchant'