Na linha de comando, digitei um comando e pressione Enter. Não produz nada. Como posso saber se está em execução e ainda não está em exibição ou se está solicitando a entrada do usuário?
command-line
process
io
Gqqnbig
fonte
fonte
PS1
avisado.cat
comando. Basta digitarcat
sozinho e ele aguardará a entrada de stdin, mas não fornecerá nenhum prompt. Muitos outros comandos se comportam da mesma forma porque esperam entrada do stdin ou de um arquivo, mas não diferenciam entre diferentes fontes de entrada (terminal interativo, canal, arquivo ...).Respostas:
Existem várias abordagens:
Tente sinalizar o fim da entrada : sem privilégios de superusuário, é difícil saber o que está acontecendo sob o capô. O que pode ser feito é pressionar Ctrl+ d. Terminais e utilitários no modo canônico enviam todo o texto disponível para
read()
syscall ao receber o sinal EOT vinculado a essa combinação de teclas e, se não houver entrada -read()
retorna o status de saída negativo que a maioria dos utilitários aceita como sinal de saída. Portanto, se um utilitário estiver aguardando a entrada, ele sairá ao receber a combinação de teclas. Caso contrário, o utilitário está executando tarefas ou não foi gravado corretamente.Espionando syscalls : se você tiver privilégios de superusuário, poderá executar
strace
em outro terminal para ver o que está sendo feito no momento. Para isso, você precisa descobrir o PID do programa. Por exemplo, em outra guia do terminal, executepgrep -f firefox
1234 como exemplo e depoissudo strace -f -p 1234
. Se a saída que você vê está presa noread()
syscall, significa que o comando provavelmente está aguardando a entrada. Caso contrário, se você vir os syscalls sendo executados, o comando estará fazendo outra coisa. Consulte uma pergunta relacionada para o uso destrace
para descobrir também se o comando de execução longa saiu.Use os próprios métodos do comando : Entre outras coisas, utilitários como
dd
sinais de uso. Por exemplo, se você usarkill -USR1 1234
(em que 1234 é o PID dodd
comando em execução ), ele será impresso para indicar a quantidade de bytes processados atualmente. Obviamente, isso requer conhecimento sobre esse comportamento do comando em primeiro lugar. Os dois métodos acima são mais gerais e não exigem conhecimento profundo do comportamento de cada comando (embora seja sempre melhor saber o que você está realmente executando - caso contrário, você corre o risco de executar um comando que pode causar danos).fonte
strace
método :-) Mas métodos mais simples também são úteis (gerais ou específicos para cada programa). Alguns deles funcionam sem privilégios de superusuário. Exemplos: verifique sedd
está fazendo algo e verifique por quegrep --color asdf
está esperando silenciosamente.dd
eu vou adicionar esse.Como saber se um programa está sendo executado ou deseja entrada do usuário
Depende do programa e como você o invoca.
Freqüentemente, mas nem sempre, haverá um prompt, indicando que o programa está solicitando entrada.
Se você não tiver certeza, pode verificar se o processo do programa está ocupado
usa CPU - use
top
ouhtop
lê ou escreve - use
sudo iotop -o
E quando o programa terminar, você verá o prompt do shell.
Shellscript
running
Eu tinha um shellscript que verifica se um programa está sendo executado e agora adicionei a opção
-s
de executá-losudo strace -f -p <PID>
(de acordo com a resposta de Sergiy Kolodyazhnyy) quando um ... é encontrado.O shellscript usa
ps -ef
para encontrar a maioria dos programassystemctl is-active --quiet
para encontrar alguns programase se você desejar
strace
em umaxterm
janela.Instale
xterm
se você deseja usarstrace
para assistir à atividade de um programa.Uso
Você pode instalar o shellscript
running
em um diretório,PATH
se desejar acesso fácil a ele.O código do shellscript
Demo
Verificando as janelas do terminal no Lubuntu (o LXTerminal foi iniciado como
x-terminal-emulator
e asgnome-terminal
janelas personalizadas ),Há muita atividade assim que o cursor está na janela do terminal.
Iniciando
grep
(aguardando entrada de/dev/stdin
)Verificando
Não há muita atividade e você pode identificar o que está acontecendo.
fonte
iotop
, embora o uso da CPU possa não ser necessariamente um indicador se um processo estiver ocupado. Um programa escrito em C e otimizado pode estar usando CPU mínima. Alguns dos indicadores que eu escrevi no Python agendam uma tarefa repetida para execução, portanto, ele pode usar a CPU para atualizar o menu do indicador por um breve momento e então fica lá.strace
método é melhor, mas talvez não seja necessário ou não esteja disponível.Não tenho certeza se você ainda precisa disso, mas ainda é um truque útil para saber: se o programa parece sair sem nenhuma saída, você pode verificar se está executando em segundo plano executando
Felicidades!
fonte
Se você estiver executando o shell em um terminal, por exemplo, um emulador de terminal ou uma sessão ssh típica, seu shell quase certamente ativou o controle de tarefas. Isso facilita muito a obtenção de uma resposta para sua pergunta na maioria dos casos.
Digite Ctrl+Zpara suspender o processo e, em seguida,
bg
continue em segundo plano, digite uma linha vazia no shell para verificar se o programa foi interrompido por um sinal.Se o processo estiver tentando ler no terminal, ele receberá imediatamente um
SIGTTIN
sinal e será suspenso. (Quando o controle de trabalho está ativado, o sistema permite a leitura de apenas um processo de cada vez no terminal.) O shell relatará isso. Você pode digitarfg
para continuar o processo em primeiro plano e digitar a entrada a ser lida pelo programa normalmente.Alguns programas, como editores, capturam ou ignoram o sinal gerado por Ctrl+Zou colocam o terminal em um modo em que os caracteres de controle nem geram sinais. Você vai precisar usar técnicas mais avançadas neste caso, como o uso
strace
para ver se o processo está fazendoread
,select
,poll
, etc.fonte