Sur la ligne de commande, j'ai tapé une commande et appuyez sur Entrée. Il ne produit rien. Comment savoir s'il est en cours d'exécution et pas encore sorti, ou s'il demande une entrée utilisateur?
command-line
process
io
Gqqnbig
la source
la source
PS1
invite.cat
commande. Tapez simplementcat
par lui-même et il attendra l'entrée de stdin, mais ne donnera aucune invite. De nombreuses autres commandes se comportent de manière similaire car elles attendent des entrées de stdin ou d'un fichier, mais ne différencient pas les différentes sources d'entrée (terminal interactif, pipe, fichier ...).Réponses:
Il existe plusieurs approches:
Essayez de signaler la fin de l'entrée : sans privilèges de superutilisateur, il est difficile de savoir ce qui se passe sous le capot. Ce qui peut être fait est d'appuyer sur Ctrl+ d. Les terminaux et les utilitaires en mode canonique envoient tout le texte disponible à
read()
syscall lors de la réception du signal EOT lié à cette combinaison de touches, et s'il n'y a pas d'entrée -read()
renvoie un état de sortie négatif que la plupart des utilitaires acceptent comme signal de sortie. Par conséquent, si un utilitaire attend une entrée, il se fermera lors de la réception de la combinaison de touches. Sinon, l'utilitaire exécute des tâches ou n'est pas écrit correctement.Espionner les appels système : si vous disposez du privilège de superutilisateur, vous pouvez exécuter
strace
dans un autre terminal pour voir ce qui est actuellement en cours. Pour cela, vous devez connaître le PID du programme. Par exemple, dans un autre onglet de terminal, exécutezpgrep -f firefox
1234 comme exemple, puissudo strace -f -p 1234
. Si la sortie que vous voyez est bloquée surread()
syscall, cela signifie que la commande attend probablement une entrée. Sinon, si vous voyez des appels système s'exécuter, alors la commande fait autre chose. Voir une question connexe pour l'utilisation destrace
afin de déterminer également si la commande longue s'est terminée.Utilisez les propres méthodes de la commande : entre autres, des utilitaires tels que l'
dd
utilisation de signaux. Par exemple, si vous utilisezkill -USR1 1234
(où 1234 est le PID de ladd
commande en cours d'exécution ), il s'imprime pour afficher la quantité d'octets actuellement traités. Bien sûr, cela nécessite en premier lieu de connaître un tel comportement de la commande. Les deux méthodes ci-dessus sont plus générales et ne nécessitent pas une connaissance approfondie du comportement de chaque commande (bien qu'il soit toujours préférable de savoir ce que vous exécutez réellement - sinon vous risquez d'exécuter une commande qui peut endommager).la source
strace
méthode :-) Mais des méthodes plus simples sont également utiles (générales ou spécifiques à chaque programme). Certains d'entre eux fonctionnent sans privilèges de superutilisateur. Exemples: vérifiez sidd
fait quelque chose et pourquoigrep --color asdf
attend en silence.dd
je vais ajouter celui-là.Comment savoir si un programme est en cours d'exécution ou si vous souhaitez une entrée utilisateur
Cela dépend du programme et de la façon dont vous l'invoquez.
Souvent, mais pas toujours, il y aura une invite, qui indique que le programme demande une entrée.
Si vous n'êtes pas sûr, vous pouvez vérifier si le processus du programme est occupé
utilise le processeur - utilisez
top
ouhtop
lit ou écrit - utilisez
sudo iotop -o
Et lorsque le programme sera terminé, vous verrez l'invite du shell.
Shellscript
running
J'avais un shellscript qui vérifie si un programme est en cours d'exécution, et maintenant j'ai ajouté l'option
-s
pour le faire fonctionnersudo strace -f -p <PID>
(selon la réponse de Sergiy Kolodyazhnyy) lorsqu'un ... est trouvé.Le shellscript utilise
ps -ef
pour trouver la majorité des programmessystemctl is-active --quiet
trouver des programmeset si vous le souhaitez
strace
dans unexterm
fenêtre.Installez
xterm
si vous souhaitez utiliserstrace
pour regarder l'activité d'un programme.Usage
Vous pouvez installer le shellscript
running
dans un répertoire dePATH
si vous souhaitez y accéder facilement.Le code shellscript
Démo
Vérification des fenêtres de terminal à Lubuntu (LXTerminal démarré en tant
x-terminal-emulator
quegnome-terminal
fenêtres personnalisées ),Il y a beaucoup d'activité dès que le curseur est dans la fenêtre du terminal.
Démarrage
grep
(en attente de l'entrée de/dev/stdin
)Le vérifier
Il n'y a pas beaucoup d'activité et vous pouvez identifier ce qui se passe.
la source
iotop
, bien que l'utilisation du processeur ne soit pas nécessairement un indicateur si un processus est occupé. Un programme écrit en C et optimisé peut utiliser un minimum de CPU. Certains des indicateurs que j'ai écrits en Python planifient une tâche répétée à exécuter, il peut donc utiliser le processeur pour mettre à jour le menu des indicateurs pendant un bref instant, puis rester là.strace
méthode est meilleure, mais peut-être pas nécessaire ou non disponible.Je ne sais pas si vous en avez toujours besoin, mais c'est une astuce utile à savoir: si le programme semble se terminer sans sortie, vous pouvez vérifier s'il s'exécute en arrière-plan en exécutant
À votre santé!
la source
Si vous exécutez le shell dans un terminal, par exemple un émulateur de terminal ou une session ssh typique, votre shell a presque certainement activé le contrôle des travaux. Cela rend la réponse à votre question très facile dans la plupart des cas.
Tapez Ctrl+Zpour suspendre le processus, puis
bg
pour le poursuivre en arrière-plan, puis tapez une ligne vide dans le shell pour qu'il vérifie si le programme a été arrêté par un signal.Si le processus tente de lire à partir du terminal, il recevra immédiatement un
SIGTTIN
signal et sera suspendu. (Lorsque le contrôle des travaux est activé, le système autorise un seul processus à la fois à lire à partir du terminal.) Le shell le signale. Vous pouvez ensuite taperfg
pour continuer le processus au premier plan, puis taper l'entrée à lire par le programme comme d'habitude.Certains programmes, tels que les éditeurs, piègent ou ignorent le signal généré par Ctrl+Zou mettent le terminal dans un mode où les caractères de contrôle ne génèrent même pas de signaux. Vous aurez besoin d'utiliser des techniques plus avancées dans ce cas, comme l' utilisation
strace
de voir si le processus est en train de faireread
,select
,poll
, etc.la source