Processos em segundo plano não podem ler do terminal. Se eles tentarem, eles serão suspensos por um sinal SIGTTIN ( t ele t ype em put). A razão para esse recurso é que, se mais de um processo estivesse tentando ler a partir do terminal, cada caractere iria essencialmente para um dos processos, o que não é um comportamento útil. Assim, o processo de primeiro plano recebe a entrada e os processos de segundo plano não.
(eu simplifiquei um pouco. Leia sobre os terminais de controle e controle de acesso do terminal se você quiser uma especificação mais precisa, mas raramente encontrará cenários em que precise cavar mais fundo do que o que escrevi acima.)
Se o sudo tentar ler o terminal, para solicitar sua senha, ele será suspenso. Você precisa executar o sudo em primeiro plano e, em seguida, alternar para o plano de fundo.
Em geral, você pode executar um shell e depois dizer para executar um comando em segundo plano. Por exemplo, com su
, você faria su -c 'lein run &'
. Mas os autores do sudo sabem que esse é um problema comum, então há uma opção para isso: passar a opção -b
para sudo
.
sudo -b -E lein run
Da mesma forma, com ssh
, você pode usar -f
para entrar em segundo plano depois de solicitar uma senha. Observe que, se você fizer isso, seu processo de segundo plano não será um trabalho de shell. Se você quer rodar o programa em segundo plano e esquecer, é perfeito.