Como posso ativar um processo do estado de suspensão via sinal ou / proc?

3

Muitos anos atrás eu tive um problema com o Linux, onde os processos aleatoriamente iriam dormir. Naquela época, eu conhecia um truque com o sistema de arquivos /proc para acionar uma ativação do processo. Lembro-me vagamente de poder fazer algo como "echo R" >/proc/pid/stat , mas isso não parece ser o comando certo.

Existem muitos acessos na internet para "como eu acordo um processo de dormir?" e muitas das respostas são "oh, apenas mate!" Eu sei que há outro jeito, mas minha memória está falhando agora.

Até agora eu tentei:

kill -SIGCONT <pid>
echo "R" > /proc/<pid>/status
echo "R" > /proc/<pid>/stat
    
por Peter Grace 31.12.2015 / 15:37

2 respostas

10

O que você quer dizer com "dormir"?

Se você quer dizer estado S (sono interrompível), isso significa que o processo está esperando por E / S. O processo está atualmente envolvido em uma chamada de sistema de bloqueio. Você não pode forçá-lo a "acordar" de uma maneira genérica - o que faria então? Acorda quando a operação de entrada ou saída que deseja fazer é possível (por exemplo, quando os dados estão disponíveis para leitura, quando um canal de gravação fica pronto, etc.).

Se você quer dizer estado T (parado), isso significa que o processo está atualmente suspenso. Você pode desassociá-lo enviando um sinal CONT (SIGCONT): kill -CONT PID .

Os processos não "aleatoriamente vão dormir". Eles dormem quando não têm nada para fazer. Eles são suspensos se receberem um sinal que os impeça: SIGTSTP, SIGSTOP, SIGTTIN, SIGTTOU. Estes últimos dois sinais são enviados pela interface do terminal no kernel quando um processo em segundo plano tenta ler a partir do terminal (respectivamente gravar no terminal); Se você não está ciente disso, você pode pensar que o processo pára aleatoriamente. Se foi isso que aconteceu, você precisa trazê-lo para o primeiro plano; executar fg no shell a partir do qual você iniciou o job em background, com o argumento correto para indicar o job do qual o processo faz parte, por exemplo fg %3 .

Os arquivos stat* no /proc do Linux são somente leitura e não estou ciente de quando eles eram graváveis. Eu não sei o que você poderia esperar para escrever lá. Os dados relatados por este arquivo são dados gerenciados pelo kernel, e alguns deles podem ser alterados mais ou menos diretamente pelo processo, mas não é algo que você possa modificar do lado de fora. Por exemplo, você não pode magicamente tornar um processo passível de execução.

    
por 01.01.2016 / 03:34
0

Depende de como um processo manipula um sinal. Se ele não manuseá-lo da maneira que o processo quer, a ação padrão do sinal ocorrerá, alguns sinais podem ser capturados e outros não.

Não tenho certeza, mas você deve observar a diferença entre o processo parado e dormindo, até onde o manual do sinal diz:

  Cont   Default action is to continue the process if it is currently stopped.

Para o processo de suspensão, pode ser o comando fg .

    
por 31.12.2015 / 16:44