Como saber qual comando está sendo executado sem pará-lo?

20

No meu exemplo, estou executando um comando que demora muito para ser executado (várias horas).

Realmente não me lembro se inseri make ou make -j4.

É claro que eu poderia pará-lo e pressionar a tecla ou verificar o histórico para conhecê-lo, mas isso interromperia o processo e eu não quero que isso aconteça (caso já esteja fazendo make -j4).

Existe alguma maneira de saber qual comando está sendo executado sem interromper o processo?

Daniel Viaño
fonte
5
De outro terminal, tentepgrep -a make
John1024
2
No caso de makevocê pode parar e reiniciá-lo, ele deve continuar de onde parou.
user253751

Respostas:

34

Se você quiser ver a linha de comando completa de todas as instâncias makeem execução no seu computador, abra um novo terminal e tente:

pgrep -a make

pgrepé um programa que pesquisa todos os processos no seu computador. Nesse caso, ele está procurando programas nomeados make. A opção -ainforma pgreppara listar o ID do processo e a linha de comando completa para cada processo correspondente. (Sem -a, apenas retornaria o ID do processo.) Para obter mais informações sobre as muitas opções do pgrep, consulte man pgrep.

John1024
fonte
7
Isso é útil para casos simples como o da pergunta. No entanto, se o comando envolver pipelines, loops, sequências de comandos, comandos internos ou expansão de variáveis, o que você encontrará com pgrepseria diferente do comando digitado na linha de comando.
kasperd
28

Enquanto a janela do terminal estiver ativa, você pode pausar (suspender) o processo pressionando Ctrl+ Z. Você pode enviar o trabalho em segundo plano digitando bg(seu trabalho agora continuará em segundo plano e, ao mesmo tempo, você poderá trabalhar na linha de comando; isso é equivalente a iniciar um trabalho &no final da linha de comando). Em seguida, use as setas do cursor (para cima e para baixo) para ver qual comando você usou. Se desejar (mas isso não é necessário), você poderá colocar seu trabalho em primeiro plano digitando fg.

Stefan
fonte
7
Isso funciona com alguns comandos, mas não com todos. Por exemplo, se você digitar um loop como esse for X in {1..1000} ; do sleep $X ; done, o loop será interrompido e as iterações restantes não acontecerão.
kasperd
11
@ Kasperd Sim, muito chato se você me perguntar, mas eu descobri uma solução legal para esse problema. Coloque um comando complicado como esse entre parênteses, para que seja um subshell. Então Ctrl-Z suspenderá todo o subshell e continuará corretamente.
usar o seguinte código
@kasperd Não no bash, mas no zsh.
JOL
4
Não há necessidade de colocar o trabalho em segundo plano: basta suspendê-lo, verificar o histórico (ou jobs, como mostra a resposta do @ ichabod) e, em seguida, retomar o trabalho via fg.
Konrad Rudolph
10

Faço algo como Stefan: ^ Z para pausar o trabalho e depois corro jobs. Se você tiver vários processos em execução, talvez seja necessário resolver qual trabalho foi o que você pausou, mas isso geralmente fornecerá a linha de comando. Em seguida, execute fgpara continuar a execução.

ichabod
fonte
1

Uma boa maneira de ver isso dinamicamente é executar o topo, e isso informa o estado geral do sistema e os processos em execução no sistema.

Fazer um 'ps ux' mostra seus processos, juntamente com pid e outras informações, você pode usar a habilidade para eliminar algumas delas, se desejar, a página de manual é um bom recurso e, se executar uma habilidade ou matar -9, fica pegajoso travado no dispositivo aguarda etc. Você também pode enviar outros sinais para processos como -hup, obter daemons reiniciados etc.

O Top é bom, pois mostra o tamanho do processo, o tempo decorrido e os estados atuais da CPU e da memória e da troca.

Costumo fazer $ make> & make.out & e depois menos ou tail -f no arquivo de log make.out. Desde agora, o make é desanexado como um processo da minha sessão de shell.


fonte