Na prática, preciso de um processo que se comporte, como se eu tivesse pressionado Ctrl+Z
logo após o início.
Felizmente, é possível fazer isso usando um script de shell.
(Além disso, saber o PID resultante seria ótimo, para que eu pudesse continuar o processo posteriormente.)
linux
process
background-process
java.is.for.desktop
fonte
fonte
#!/bin/bash
[entrar]$@ &
[entrar]PID=$!
[entrar]kill -STOP $PID
[entrar]echo "Suspended: $PID, press ENTER to continue it"
[entrar]read
[entrar]kill -CONT $PID
[entrar]wait $PID
[entrar]echo
Em qual ambiente você está criando o processo?
Se você estiver fazendo isso em um ambiente como o código C, poderá bifurcar () e, em seguida, no filho, enviar um SIGSTOP para si mesmo antes do exec (), impedindo a execução adicional.
Uma solução mais genérica (provavelmente a melhor) seria criar um esboço que faça isso. Portanto, o programa stub:
Isso garantirá que você evite qualquer tipo de condição de corrida relacionada ao novo processamento, indo muito longe antes que você possa enviar um sinal para ele.
Um exemplo para shell:
E usando codez acima:
O
jobs -l
mostra o PID. Mas se você estiver fazendo isso a partir de um shell, não precisará do PID diretamente. Você pode apenas fazer:kill -CONT %1
(supondo que você tenha apenas um emprego).Fazendo isso com mais de um trabalho? Deixado como um exercício para o leitor :)
fonte
A resposta de MikeyB está correta. A partir desta pergunta sobre superusuário, aqui está uma versão mais concisa:
Para entender isso, é preciso entender como os processos são iniciados no unix: a
exec
chamada do sistema substitui o programa atualmente em execução por um novo , preservando o PID existente. Portanto, a maneira como um processo independente é criado é primeirofork
eexec
, em seguida , substituindo o programa em execução no processo filho pelo programa desejado.Os ingredientes deste comando shell são:
(...)
iniciam uma subcasca: outra instância do BASH.kill
comando envia o sinal STOP para esse processo, que o coloca no estado suspenso.CONT
sinal), oexec
comando fará com que ele se substitua pelo programa desejado.my_command
mantém o PID original do sub-shell.$!
variável para obter o PID do processo.fonte
-s STOP
vez de-SIGSTOP
). Ainda me pergunto: por que tem que ser em$BASHPID
vez de$$
? (Eu posso realmente não entender a diferença).$$
vs$BASHPID
, verifico que o último é o PID do sub-shell, enquanto não o primeiro. Há um problema engraçado: a aplicação da dica em um script bash geralmente falha e eu tenho que fazer algo assim:PID=$!; ps -p $PID; kill -s CONT $PID;
… falha se eu remover aps -p $PID
parte: o processo parece desaparecer (morto?) Sem uma mensagem de erro em qualquer lugar . Não há problema em um shell interativo, o problema é apenas do script. Isso é muito misterioso.$BASHPID
de conchas que não sejam o bash, consulte aqui