O processo é suspenso quando executado de forma assíncrona

1

Eu tenho o processo que gostaria de começar e esquecer. Quando executado de forma síncrona, parece que

sudo -E lein run

Isso funciona bem, indefinidamente. Não é interativo. Ele inicia um servidor da Web na porta 80. Mas quando eu executo:

sudo -E lein run &

As saídas do terminal:

[4] 30236

e alguns segundos depois:

[4] + 30236 suspended (tty input) sudo -E ../bin/lein run

e meu processo, que deve iniciar um servidor da Web na porta 80, não mostra um servidor.

Perguntas: Como faço para diagnosticar o que está acontecendo? Não acho que o padrão e o erro padrão estejam sendo impressos, mas posso estar errado. Por que o processo é suspenso? Posso obter lein run para executar de forma assíncrona de outra forma?

    
por zlrth 07.09.2017 / 03:27

2 respostas

1

O comando sudo espera poder conversar com um usuário por meio de um tty. Quando você o empurra para o fundo, ele pára porque está esperando acesso exclusivo ao tty, mas não tem mais acesso exclusivo. (É uma interface de segurança, que pode exigir uma senha e, certamente, executa um programa com diferentes direitos de acesso à conta do usuário. É importante que ele tenha acesso exclusivo ao usuário.)

Você pode executar seu programa em screen , o que lhe dá um tty virtual que não está necessariamente associado a um tty "real".

screen -md sudo -E lein run
    
por 07.09.2017 / 08:28
1

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.

    
por 09.09.2017 / 01:03