Como acordar processos inativos no linux?

2

Estou conectado a uma máquina Linux em ssh . Lá, usei screen para executar vários processos que continuarão em execução depois que eu sair da minha sessão. No entanto, depois de um tempo, os processos pararam de produzir saída (para stdout ), embora estejam ocupando memória. Eu quero saber como posso reativá-los. Aqui está a aparência da lista de processos sob o meu nome de usuário ( top -u MY_USERNAME ):

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1268 abcdef    20   0  100m 2044 1012 S  0.0  0.0   0:00.03 sshd
 1269 abcdef    20   0  105m 1940 1456 S  0.0  0.0   0:00.06 bash
12375 abcdef    20   0  115m 1452  808 S  0.0  0.0   0:00.02 screen   # contains python procs
12615 abcdef    20   0  406m  58m 2140 S  0.0  0.0   0:02.23 python   # parent process
12618 abcdef    20   0 5170m 4.7g 1176 S  0.0  1.9 546:19.26 python   # child process
12619 abcdef    20   0 5164m 4.7g 1172 S  0.0  1.9 539:33.64 python   # child process
12620 abcdef    20   0 5185m 4.7g 1172 S  0.0  1.9 547:46.92 python   # child process
12621 abcdef    20   0 5171m 4.7g 1168 S  0.0  1.9 540:45.53 python   # child process
12622 abcdef    20   0 5179m 4.7g 1172 S  0.0  1.9 546:50.28 python   # child process
12623 abcdef    20   0 5171m 4.7g 1168 S  0.0  1.9 549:20.39 python   # child process
12624 abcdef    20   0 5178m 4.7g 1172 S  0.0  1.9 543:33.55 python   # child process
12625 abcdef    20   0 5177m 4.7g 1172 S  0.0  1.9 545:59.51 python   # child process

Se for relevante: os processos não exigem entrada do usuário. Eu não tenho sudo privileges.

Você pode ver na coluna S , todos os processos são designados S . Como faço para alterá-los para R ? Isso fará com que eles retomem sua saída para stdout ?

Observação: verifiquei a questão aqui , mas isso se refere a manualmente suspendendo e acordando processos. Não sei por que meus processos foram dormir em primeiro lugar e quero acordá-los.

Editar: depois de verificar a pergunta aqui , eu corri o comando strace -p 12622 para um processo filho e obtive: futex(0x984271b0, FUTEX_WAIT_PRIVATE, 0, NULL . Wikipedia diz que é algum tipo de bloqueio. Não tenho certeza se isso é significativo.

    
por hazrmard 20.08.2016 / 03:24

1 resposta

3

"Sleep" não é realmente a metáfora correta para este estado de processo se você não for um designer de kernel. "Esperar" seria uma descrição melhor. "Sleep" no sentido intuitivo de esperar para ser acordado é chamado de "Parado", mostrado como Z .

O processo não está esperando para ser despertado pelo usuário, ele está aguardando que alguma condição específica seja atendida. Por exemplo, ele está lendo dados de um arquivo e aguardando que os dados sejam carregados do disco, ou esteja atendendo a uma conexão de rede e aguardando um pacote de entrada ou pausado por um tempo definido e aguardando o tempo limite expirar, etc. A única maneira de "acordar" é providenciar para que a condição seja satisfeita.

Como você descobriu, chamar strace -p $PID (no Linux, ou o equivalente em outras variantes unix) pode lhe diga o que o processo está fazendo e, em particular, o que ele está esperando, de uma visão de baixo nível. No entanto, não há garantia de que isso forneça dados úteis. Um futex é um tipo de bloqueio e, em geral, a única maneira de saber quem deve liberar o bloqueio é entender com precisão o que o programa está fazendo e como as bibliotecas subjacentes usam esse recurso de bloqueio do núcleo.

É possível que os programas tenham parado de produzir saída porque deixaram de receber entrada. É possível que um dos programas esteja funcionando e os outros estejam esperando por ele. É possível que haja um bug no programa e os processos estejam em um impasse. Seja o que for, é um problema de aplicação, não um problema no sistema. Não há uma maneira genérica de fazer o programa “acordar”: o programa está funcionando normalmente. Pode não estar fazendo o que você quer, mas está fazendo o que foi escrito para fazer.

    
por 22.08.2016 / 02:38

Tags