bash: pas de contrôle de travail dans cette coquille

J'ai un système Linux minimal.

init est /bin/bash , seul le minimum de librairies dans /lib/ , /dev/ est peuplé statiquement, pas de démons en cours d'exécution (no 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 

Quand je commence bash avec strace, je reçois 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, comme si bash ne peut pas ouvrir /dev/tty . Mais /dev/tty existe dans /dev/ et a les permissions 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 pas ouvrir /dev/tty ? Et que signifie l'erreur ENXIO ?

init est /bin/bash

Comme je l'ai dit à https://unix.stackexchange.com/a/197472/5132 , init=/bin/sh n'obtient pas de filesystems "API" montés, plante d'une manière disgracieuse, sans vidage du cache quand on tape exit https://unix.stackexchange.com/a/195978/5132 ), et laisse généralement le (super) user faire manuellement les actions qui rendent le système utilisable de manière minimale.

L'une de ces actions (si vous voulez utiliser un shell de contrôle de travail, comme vous le faites apparemment) est l' acquisition d'un terminal de contrôle . /dev/tty n'est pas un périphérique terminal réel. C'est un appareil qui redirige vers n'importe quel terminal d'ouverture du process d'ouverture. S'il n'en a pas , car le process n ° 1 ne commence pas (et généralement tout le time où un vrai programme du gestionnaire de système est exécuté en tant que process n ° 1), l'ouverture du périphérique échoue.

Votre système est trop minime. Vous devez exécuter un programme qui configure un terminal de contrôle, initialise une session appropriée et fait probablement quelques-uns des minima de la gestion du système tels que l'arrêt proprement et proprement, qui exécute ensuite votre shell de contrôle de travail.

Plus de lecture

  • Alan Cox (2009-04-06). Périphériques alloués par Linux . 2,6+ . kernel.org.