O manual do GNU Screen diz:
`-d -m'
Start `screen' in _detached mode. This creates a new session
but doesn't attach to it. This is useful for system startup
scripts.
`-D -m'
This also starts `screen' in _detached_ mode, but doesn't fork
a new process. The command exits if the session terminates.
-dm
está bem claro para mim:
screen
bifurca um novo processo para executar o comando fornecido (ou um shell se nada for especificado).- Por "fork" significa aquela estranha chamada de sistema de Schrödinger na qual o código-fonte não sabe se é o pai ou o filho até que o valor de retorno seja observado.
- E esse novo processo é reconhecido por
screen
como algo que pode ser anexado.
Percebi que -dm
retorna o controle do shell, mas -Dm
bloqueia.
Então minha pergunta é:
- Por que
-Dm
bloqueia? E como isso está relacionado à falta de bifurcação? - O que ele faz em vez de bifurcar? Acho que ainda cria um novo processo, porque "modo separado" sugere um processo identificável por um PID que pode ser anexado.
- Qual é o caso de uso de
-Dm
em vez de-dm
?
Obrigado!
No contexto citado da
screen
documentação, você pode ler "para bifurcar um novo processo " como "para iniciar um novo processo filho ". Correndo o risco de ir longe demais, veja como você pode considerar o processo para funcionar. Para criar um filho, um processo deve usarfork(2)
. Esse processo filho é executado livremente a partir do pai e o filho existe paraexec(2)
o comando que deve ser executado a partir do pai. O pai pode escolher -wait(2)
para que o processo filho seja concluído, o que significa que ele será bloqueado até que o filho saia e receberá o status de saída dawait(2)
chamadaSIGCHLD
sinal informando que a criança saiu, e neste momento chamarwait(2)
para receber o status de saídaAgora, com isso em mente, veja como isso se aplica ao
screen
.Normalmente, você deseja
screen -dm
criar um novo processo (filho) e desanexá-lo, permitindo que sua própria execução de comando continue. Por exemplo, isso pode fazer sentido em~/.profile
todo o sistema ou no antigo,/etc/rc.local
onde você não deseja que um comando seja bloqueado. Nesse caso, o processo filho descrito acima é, na verdade, outra parte descreen
, que, por sua vez, inicia o processo de comando real como outro filho (um neto do pai original). As duas partes descreen
se comunicam, e a instância filho descreen
gerencia seu filho de comando que faz o trabalho que você realmente deseja.Ocasionalmente, você pode querer usar
screen
sob o controle de um supervisor, comosystemd
. Neste caso, você usariascreen -Dm
para que o supervisor identificasse se/quando o processo gerenciado porscreen
havia encerrado, possivelmente com a intenção de reiniciá-lo. Sescreen
tivesse separado o processo filho - como faria comscreen -dm
- o supervisor não seria capaz de dizer facilmente se ele ainda estava em execução ou não; os-Dm
sinalizadores permitemscreen
fornecer todos os seus recursos ao processo filho enquanto ainda comunicam sua existência ao pai. Neste caso, o processo do meio (o filhoscreen
) não é criado e oscreen
pai controla diretamente o comando filho que faz o trabalho que você realmente deseja.Considerar
screen -dm sleep 30
- seu shell interativo que iniciou oscreen
comando não pode dizer se osleep 30
ainda está em execução ou não. Não há feedback.screen -Dm sleep 30
- seu shell interativo bloqueia até assleep 30
saídas. Neste ponto, você sabe que não está mais em execução. Claramente não é tão útil para uma sessão interativa, mas é excelente para um ambiente de supervisão como osystemd
.