Como inicio um segundo shell no modo de usuário único?

14

Isso pode parecer uma contradição em termos, mas recentemente precisei usar o modo de usuário único (também conhecido como modo de manutenção) por algum tempo (dias!) Enquanto tentava reconstruir um array RAID quebrado.

Enquanto fazia isso, me vi querendo usar um segundo shell para coisas como verificar / editar as configurações em vários arquivos de configuração ou examinar os logs do sistema enquanto o console principal (e único) está ligado, executando algum processo de recuperação.

Qual seria o comando recomendado para iniciar um segundo shell em outro tty?

Obviamente, um método pode ser o de usar screenno tty1, mas isso não tem a facilidade de alternar apenas sessões com Alt-F1, Alt-F2, etc.

StarNamer
fonte
4
screené tão fácil quanto isso. Não Ctrl AP não parecer muito mais complicado do que Alt F1 ...
mveroone
Vale a pena notar que aplicativos como screene tmuxpara gerenciamento de janelas TUI nem sempre funcionam. Às vezes você precisa de um ttyXdispositivo real , em vez de um pts.
Tiro parta

Respostas:

14

Há um comando projetado especificamente para esta situação: openvt. Basta executar a openvtpartir do seu shell em tty1 e você encontrará um shell em execução no primeiro tty que ainda não tinha algo (provavelmente tty2). Existem várias opções que você pode achar úteis; veja a página de manual do openvt.

Como este não é um login gerenciado pelo getty, quando você sair do novo shell, não verá um prompt de login. O tty simplesmente ficará inoperante, pois não haverá processos em execução nele, mas você ainda poderá alternar (Alt-F1 Alt-F2) e ver o que estava na tela quando saiu do shell. O deallocvtcomando destrói ttys que estão nesse estado zumbi, retornando ao estado original "Alt-F2 não faz nada".

Originalmente, esses comandos foram chamados opene disalloc, mas, eventualmente, alguém decidiu alterá-los porque eram muito genéricos e desalocados, sendo considerados "nem uma palavra".

Antigamente, era comum o driver do teclado e o init serem configurados para que o Alt + Up funcionasse open, de modo que funcionasse como uma tecla de atalho para gerar um shell em um novo console. Você ainda pode encontrar um remanescente dessa configuração antiga, comentada, no seu /etc/inittab. (Se você não estiver usando um novo init sofisticado que não tenha um inittab.)

Há uma pergunta semelhante aqui

Comunidade
fonte
3
Legal, eu não estava ciente openvt. +1.
jscott
Isso realmente parece muito mais fácil do que getty. Eu nunca percebi que já estava instalado.
21414 StarNamer
Apenas pensei em relatar que passei mais de uma semana com um sistema no modo de usuário único reparando uma matriz RAID e openvtprovando ser muito útil. Obrigado por trazer um novo comando ao meu aviso.
StarNamer 25/03
12

Você pode gerar outro gettypara o tipo que desejar. Inicialize no modo de usuário único e inicie um gettyem tty2:

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

Agora você pode Alt+ F2passar para o novo tty. Repita o procedimento para ttys adicionais, conforme necessário. Você provavelmente poderia fazer algo mais limpo e apenas configurar /etc/inittabpara lidar automaticamente com isso no modo de usuário único.

jscott
fonte
Parece o que estou procurando. Vou tentar da próxima vez.
21814 StarNamer
Tentei. Funciona, mas como a sessão de login não é gerada init, ela não é gerada novamente se morrer.
21814 StarNamer
Na verdade, estamos apenas colocando isso em segundo plano no exemplo acima. Se você precisar da oferta completa de um vt real, estará invadindo /etc/inittabe, /etc/rc1.d/S??singlepelo menos.
jscott
2

Você provavelmente pode ficar sem uma instância extra do shell usando JOB CONTROLno seu shell atual. Está documentado na página de manual do bash(1).

Você pode simplesmente suspender uma tarefa usando a sequência Ctrl+ Zpor padrão, embora ela possa ser configurada no seu terminal de uma maneira diferente, verifique a saída de stty -a:

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

Você pode verificar seus trabalhos emitindo jobs:

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

Traga um deles para o primeiro plano:

$ fg %3

Ou retome-o em segundo plano:

$ bg %2

Este método não possui muitas vantagens screenou tmux, mas pode ser igualmente útil em algumas situações.

dawud
fonte
O ponto é que eu não quero suspender ou interferir no processo em execução no console inicial. Por exemplo, ao executar ddrescueEu não quero manter interromper e retomar-lo mesmo que ele está configurado para fazer isso ..
StarNamer
Alguns problemas com isso. Por um lado, ele pode não estar usando o bash como seu shell (poderia estar usando csh, tcshou zsh, por exemplo), então mencionar sua manpage seria impreciso nesse caso. Por outro lado, isso não responde à pergunta conforme solicitado.
Tiro parta
1

Considere o uso de multiplexadores de terminal, como tmux ou screen.

Saiba mais sobre o tmux aqui: https://github.com/tmux/tmux/wiki

Marcin Kaminski
fonte
A pergunta já menciona isso: "Obviamente, um método pode ser o de usar a tela em tty1 *, mas isso não tem a facilidade de alternar apenas sessões com Alt-F1, Alt-F2, etc.".
Cristian Ciupitu
Como diz Cristian, eu já havia considerado screene sentido que outros multiplexadores eram ainda mais exagerados. Tudo o que preciso é de um segundo console simples.
21414 StarNamer
Ah, desculpe, eu esqueci screensua pergunta. Era tarde.
Marcin Kaminski
Como o uso de uma combinação de 2 teclas é "exagero", além de gerar novos TTYs e ancorá-los separadamente e tal?
mveroone
IMO, é uma definição estranha de 'um exagero', mas hey, o que funciona para alguém, eu estou bem com isso;)
Marcin Kaminski