Atualmente estou usando um cliente SSH para conectar-me a um servidor que meu laboratório está usando. Eu tinha uma dúvida sobre o conceito de "sessão executada em segundo plano". Dei uma olhada em uma pergunta nesta comunidade (o que é um processo em segundo plano?), mas sinto que é um pouco diferente do que estou pensando.
O servidor com o qual estamos trabalhando (não tenho certeza se é o servidor ou a conexão com a Internet) está apresentando alguns problemas, como quando deixamos um processo rodando durante a noite e voltamos pela manhã, as sessões do shell são desconectadas.
Uma solução que alguém sugeriu é usar o programaTmuxpara contornar esse problema. O que o programa afirma fazer é desconectar uma sessão para que, mesmo que o servidor seja desconectado, nosso processo não seja perturbado.
Eu estava pensando: o que exatamente significa um processo estar "executando em segundo plano" como este? É igual à pergunta que coloquei no link acima e simplesmente não estou entendendo corretamente? Além disso, o que significa “anexar ou desanexar” uma sessão?
Acho que minha confusão vem do fato de não entender como uma sessão pode estar em execução quando o shell é desconectado.
Obrigado!
Responder1
Você está tendo dificuldade com o conceito porque não existe tal conceito. Grupos de processospode estar em segundo plano/primeiro plano. O conceito não se aplica asessões, nem o que o sistema operacional chama de sessões nem o que tmux
chama de sessões, que são duas coisas muito diferentes.
O tmux
que faz é criar um ou mais pseudoterminais, que os programas em execução tmux
vêem como seus terminais de controle (e entradas, saídas e erros padrão, para começar). Istomultiplexesesses terminais internos em um únicoexteriorterminal, que será o pseudoterminal configurado pelo servidor SSH em sua máquina quando você efetuou login via SSH.
Existem dois tmux
processos, um de longa duraçãoservidorque se conecta às extremidades traseiras (ou seja, lados "mestres", para usar uma terminologia que não está mais na moda) de todos esses pseudoterminais internos, e umclienteesse é o intermediário entre esse servidor e o terminal externo realizado. Na verdade, podem haver vários clientes, mas essa é uma complexidade que podemos encobrir aqui, pois não muda a questão.
Oservidoro processo existe enquanto houver pelo menos um pseudoterminal interno restante. Ele agrupa os pseudoterminais em coleções, que são o que tmux
chamasessões. Isso não deve ser confundido com o que seu sistema operacional chama de sessão (uma coleção de grupos de processos e, opcionalmente, um terminal de controle) ou umsessãopor SSH (entre o servidor SSH remoto e seu cliente SSH local). "sessão" pode denotar muitas coisas diferentes. Observe que estou qualificando-o de várias maneiras com " tmux
", "SSH" e "sistema operacional" aqui.
Oclienteo processo é transitório e desaparece -destacandoda tmux
sessão e do servidor — com perda da conexão SSH. Ao fazer login novamente com SSH, você cria umnovocliente quereconectapara (uma tmux
sessão gerenciada pelo) servidor, e esse novo cliente realiza a interface do usuário do tmux
servidor - todos osjanelasna tmux
sessão e na linha de status - no novo pseudoterminal para sua nova sessão de login SSH. Um cliente realiza uma tmux
sessão de cada vez, aquela à qual está atualmente vinculado.
O processo cliente faz parte do que o sistema operacional chama de sessão, a sessão que é controlada peloexteriorpseudoterminal criado pelo seu servidor SSH para login SSH. Ele está sujeito ao tempo de vida dessa sessão do sistema operacional, que por sua vez está sujeito ao tempo de vida da sessão SSH, e pode estar no grupo de processos em segundo plano ou em primeiro planodaquele terminal externo. Está (assim) sujeito acontrole de trabalho shelldo shell de login dessa sessão SSH.
O processo do servidor é totalmente separado do terminal externo e de suas sessões do sistema operacional. Não está sujeito ao tempo de vida deles. Isso énão emseus grupos de processos de segundo plano ou de primeiro plano. Sua vida útil é determinada unicamente pela existência continuada deinternoterminais, cujas E/S ele atende aos tmux
clientes.
Háinternoeexteriorterminais. Háapegadoeseparado tmux
sessões, por extensão de clientes conectando-se e desconectando-se de tmux
servidores. Háativoeinativojanelas dentro de uma tmux
sessão. O conceito de controle de trabalho shell defundoeprimeiro planonão está envolvido.
Responder2
Pode-se dizer que os processos Unix estão "executando em segundo plano" de duas maneiras principais:
Ainda criado por outro processo como o shell. Isto é o que acontece se você usar o
&
operador em shells Bourne:sleep 10 &
Este
sleep
processo será executado em segundo plano pelo shell, portanto continuará em execução, mas você poderá interagir com o prompt do shell e executar outros comandos. Se um programa rodando em segundo plano como este tentar ler qualquer entrada, ele será interrompido com oSIGTTIN
sinal.Porém, o que é mais importante, ele ainda pertence ao processo shell onde foi iniciado e ainda está conectado ao tty (o terminal onde está sendo executado), e se o tty estiver fechado (a conexão ssh cai e o shell sai), o o processo será eliminado com
SIGHUP
.Isso é chamado de controle de tarefa de shell - os processos podem ser colocados em segundo plano com
&
oubg
ou^Z
e trazidos de volta para o primeiro plano comfg
e listados comjobs
e assim por diante. Na verdade, ele se destina a colocar temporariamente em segundo plano um comando enquanto você trabalha em outro, não para processos de longa execução que precisam ser protegidos contra a saída do shell e a saída do terminal.Um processo daemon. Este é um processo que se separa totalmente do processo pai e de seus ttys. Ele tem um novo grupo de processos e ID de sessão e seu pai é PID 1 (normalmente
init
, embora no Linux moderno eu acredite quesystemd
tenha assumido essa função). Como um processo daemon não é pai do shell e não está anexado a um tty, ele não é eliminado quando o shell sai ou o tty é fechado. Ele deve ser explicitamente eliminado pelo sistema ou pelo usuário. A maioria dos sistemas Unix vem com muitos daemons padrão para fazer todo tipo de coisa.
Esta é uma explicação ampla e há muitos detalhes sobre controle de tarefas shell e processos daemon que não mencionei.
Existe um programa chamado nohup
que pode fazer um programa rodar com (1) ignorar o SIGHUP
sinal para que não saia quando o tty fechar. Isso não o torna um daemon verdadeiro, mas é bom para trabalhos simples que apenas geram saída e nunca requerem nenhuma entrada.
tmux é um programa que roda como um daemon, mas permite executar outros programas (shells ou qualquer outra coisa) dentro dele. tmux é muito mais sofisticado do que nohup
- você pode executar programas em tela cheia e programas que requerem entrada e saída. Por ser um daemon, ele não é eliminado quando o tty desaparece (por exemplo, quando a conexão ssh cai).
No tmux, "anexado" significa que o tmux está mostrando um ou mais processos em execução dentro dele em um terminal. Você pode "desconectar" o tmux desse terminal e depois "conectá-lo" novamente a um terminal diferente. A desconexão acontece automaticamente se a conexão ssh cair ou for interrompida. Assim, você pode fechar seu terminal e ssh, depois conectar-se a partir de um terminal diferente e anexar o tmux e tudo estará como estava.