Come posso avviare una seconda shell in modalità utente singolo?


14

Questo può sembrare una contraddizione in termini, ma recentemente ho dovuto usare la modalità utente singolo (aka modalità di manutenzione) per un po 'di tempo (giorni!) Mentre provavo a ricostruire un array RAID rotto.

Mentre facevo questo, mi sono ritrovato a voler usare una seconda shell per cose come il controllo / modifica delle impostazioni in vari file di configurazione o l'esame dei registri di sistema mentre la console principale (e unica) è legata eseguendo un processo di recupero.

Quale sarebbe il comando raccomandato per lanciare una seconda shell su un'altra tty?

Ovviamente, un metodo potrebbe essere quello di utilizzare screenin tty1, ma questo non ha la facilità di passare da una sessione all'altra con Alt-F1, Alt-F2, ecc.


4
screenè altrettanto facile. Ctrl AP non sembra molto più complicato di Alt F1 ...
mveroone

Vale la pena notare che app come screene tmuxper la gestione delle finestre TUI non sempre fanno il trucco. A volte è necessario un ttyXdispositivo reale , anziché un pts.
Parthian Shot,

Risposte:


14

C'è un comando specifico per questa situazione: openvt. Esegui semplicemente openvtdalla tua shell su tty1 e troverai una shell in esecuzione sul primo tty che non aveva già qualcosa (probabilmente tty2). Ci sono diverse opzioni che potresti trovare utili; vedi la pagina man di openvt.

Dato che questo non è un login gestito da getty, quando esci dalla nuova shell non vedrai apparire un prompt di login. Il tty diventerà morto poiché non ci saranno processi in esecuzione su di esso, ma sarai comunque in grado di passare avanti e indietro (Alt-F1 Alt-F2) e vedere cosa era sullo schermo quando sei uscito dalla shell. Il deallocvtcomando distrugge tty che si trovano in questo stato simile agli zombi, tornando allo stato originale "Alt-F2 non fa nulla".

Inizialmente questi comandi venivano chiamati opene disalloc, ma alla fine qualcuno decise di cambiarli perché troppo generici e disallocati furono giudicati "non una parola".

Ai vecchi tempi era normale che il driver della tastiera e init fossero configurati in modo che Alt + Up funzionasse open, quindi fungeva da tasto di scelta rapida per generare una shell su una nuova console. Potresti ancora trovare un residuo di quella vecchia configurazione, commentato, nel tuo /etc/inittab. (Se non stai usando qualche nuovo init di fantasia che non ha un inittab.)

C'è una domanda simile qui


3
Bello, non ne ero a conoscenza openvt. +1.
jscott,

Questo in realtà sembra molto più facile di getty. Non ho mai realizzato che fosse già installato.
StarNamer,

Ho pensato di riferire che avevo appena trascorso più di una settimana con un sistema in modalità utente singolo per riparare un array RAID e openvtsi è rivelato molto utile. Grazie per aver portato un nuovo comando alla mia notifica.
StarNamer,

12

Potresti gettygenerarne un altro per qualunque tanta tu voglia. Avvia in modalità utente singolo, quindi avvia a gettysu tty2:

root@host:~# /sbin/getty 38400 tty2 &

Ora puoi Alt+ F2passare alla nuova tty. Ripetere l'operazione per ulteriori tty secondo necessità. Probabilmente potresti fare qualcosa di più pulito e configurarlo /etc/inittabper gestirlo automaticamente in modalità utente singolo.


Sembra quello che sto cercando. Ci proverò la prossima volta.
StarNamer

Provato. Funziona, ma poiché la sessione di accesso non viene generata init, non viene rigenerata se muore.
StarNamer,

In effetti, lo stiamo semplicemente facendo cadere sullo sfondo nell'esempio sopra. Se hai bisogno dell'offerta completa di un vero vt, stai per hackerare /etc/inittabe /etc/rc1.d/S??singleper lo meno.
jscott,

2

Probabilmente puoi fare a meno di un'istanza di shell aggiuntiva utilizzando JOB CONTROLla shell corrente. È documentato nella manpage di bash(1).

Puoi semplicemente sospendere un'attività usando la sequenza Ctrl+ Zper impostazione predefinita, sebbene possa essere configurata nel tuo terminale in un modo diverso, controlla l'output di stty -a:

$ stty -a | grep susp
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;

Puoi controllare i tuoi lavori emettendo jobs:

# jobs
[1]   Stopped                 journalctl -f
[2]-  Stopped                 vim /etc/hosts
[3]+  Stopped                 tail -f /var/log/firewalld

Portane uno in primo piano:

$ fg %3

O riprenderlo in background:

$ bg %2

Questo metodo non presenta molti dei vantaggi di screeno tmux, ma può essere ugualmente utile in alcune situazioni.


Il punto è che non voglio sospendere o interferire con il processo in esecuzione sulla console iniziale. Ad esempio, quando ddrescue
corro

Un paio di problemi con questo. Per uno, non stia utilizzando bash come suo guscio (potrebbe essere utilizzato csh, tcsho zsh, per esempio), quindi accennare al suo manpage sarebbe inesatto in questo caso. Per un altro, questo non risponde alla domanda come posta.
Parthian Shot,

1

Prendi in considerazione l'utilizzo di multiplexer terminali come tmux o screen.

Scopri di più su tmux qui: https://github.com/tmux/tmux/wiki


La domanda menziona già questo: "Ovviamente, un metodo potrebbe essere quello di utilizzare lo schermo in tty1 *, ma questo non ha la facilità di cambiare sessione con Alt-F1, Alt-F2, ecc.".
Cristian Ciupitu,

Come dice Cristian, avevo già considerato screene sentito che altri multiplexer erano ancora più esagerati. Tutto ciò di cui ho bisogno è una semplice seconda console.
StarNamer

Ah, scusa, ho ignorato la screentua domanda. Era tardi.
Marcin Kaminski,

In che modo l'uso di una combinazione di 2 chiavi può essere "eccessivo" accanto alla generazione di nuovi TTY e all'ancoraggio ad essi separatamente e simili?
mveroone,

IMO, è una strana definizione di "eccessivo" ma hey, qualunque cosa funzioni per qualcuno, sto bene;)
Marcin Kaminski
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.