В командной строке я набрал команду и нажал ввод. Это ничего не выводит. Как мне узнать, запущен ли он и еще не выводится, или он запрашивает ввод пользователя?
command-line
process
io
Gqqnbig
источник
источник
PS1
подсказку.cat
команда. Просто наберитеcat
сам, и он будет ждать ввода от стандартного ввода, но не дает подсказки. Многие другие команды ведут себя аналогично, потому что они ожидают ввода от стандартного ввода или файла, но не различают разные источники ввода (интерактивный терминал, канал, файл ...).Ответы:
Есть несколько подходов:
Попробуйте сигнализировать конец ввода : без привилегий суперпользователя трудно понять, что происходит под капотом. Что можно сделать, это нажать Ctrl+ d. Терминалы и утилиты в каноническом режиме отправляют весь доступный текст в
read()
системный вызов при получении сигнала EOT, связанного с этой комбинацией клавиш, и, если нет ввода -read()
возвращает отрицательный статус выхода, который большинство утилит принимают в качестве сигнала для выхода. Поэтому, если утилита ожидает ввода, она выйдет при получении комбинации клавиш. В противном случае утилита либо выполняет задачи, либо написана неправильно.Следите за системными вызовами : если у вас есть привилегия суперпользователя, вы можете запустить
strace
другой терминал, чтобы посмотреть, что в данный момент делается. Для этого вам нужно узнать PID программы. Например, в другой вкладке терминала запустить,pgrep -f firefox
который может 1234 в качестве примера, а затемsudo strace -f -p 1234
. Если вывод, который вы видите, застрял вread()
системном вызове, это означает, что команда, вероятно, ожидает ввода. В противном случае, если вы видите запущенные системные вызовы, то команда делает что-то еще. См. Связанный вопрос для использования,strace
чтобы также выяснить, вышла ли длительная команда.Используйте собственные методы команды : среди прочего, такие утилиты, как
dd
использование сигналов. Например, если вы используетеkill -USR1 1234
(где 1234 - PID выполняемойdd
команды), он напечатает для вывода количества обработанных в настоящее время байтов. Конечно, для этого необходимо знать, прежде всего, о таком поведении команды. Вышеупомянутые два метода являются более общими и не требуют глубоких знаний о поведении каждой команды (хотя всегда лучше знать, что вы на самом деле выполняете - в противном случае вы рискуете выполнить команду, которая может нанести ущерб).источник
strace
метод :-) Но более простые методы также полезны (общие или специальные для каждой программы). Некоторые из них работают без привилегий суперпользователя. Примеры: проверьте,dd
что-то делает, и проверьте, почемуgrep --color asdf
молча ждет.dd
что я добавлю это.Как определить, запущена ли программа или требуется ввод пользователя
Это зависит от программы и от того, как вы ее вызываете.
Часто, но не всегда, появляется подсказка, указывающая, что программа запрашивает ввод.
Если вы не уверены, можете проверить, занят ли процесс программы
использует процессор - использовать
top
илиhtop
читает или пишет - используйте
sudo iotop -o
И когда программа закончится, вы увидите подсказку оболочки.
Shellscript
running
У меня был шеллскрипт, который проверяет, запущена ли программа, и теперь я добавил возможность
-s
запустить ееsudo strace -f -p <PID>
(согласно ответу Сергея Колодяжного), когда ... найден.Скрипт использует
ps -ef
найти большинство программsystemctl is-active --quiet
найти несколько программи если вы хотите
strace
вxterm
окне.Установите,
xterm
если хотите использоватьstrace
для наблюдения за активностью программы.использование
Вы можете установить скрипт
running
в каталог,PATH
если вы хотите легкий доступ к нему.Код шеллскрипта
демонстрация
Проверка окон терминала в Lubuntu (LXTerminal запускается как
x-terminal-emulator
и пользовательскиеgnome-terminal
окна),Существует много активности , как только курсор находится в окне терминала.
Запуск
grep
(ожидание ввода от/dev/stdin
)Проверять это
Там не так много активности, и вы можете определить, что происходит.
источник
iotop
, хотя использование процессора не обязательно может быть индикатором, если процесс занят. Программа, написанная на C и оптимизированная, может использовать минимальный процессор. Некоторые из индикаторов, которые я написал в Python, планируют повторное выполнение задачи, поэтому он может использовать CPU, чтобы на короткое время обновить меню индикаторов, а затем просто сидеть там.strace
метод лучше, но, возможно, не нужен или не доступен.Не уверен, что вам все еще нужно это, но все же полезный трюк, чтобы знать: если кажется, что программа завершает работу без вывода, вы можете проверить, работает ли она в фоновом режиме, выполнив
Ура!
источник
Если вы запускаете оболочку в терминале, например, в эмуляторе терминала или в типичном сеансе ssh, в вашей оболочке почти наверняка включено управление заданиями. Это делает получение ответа на ваш вопрос очень простым в большинстве случаев.
Введите, Ctrl+Zчтобы приостановить процесс и затем
bg
продолжить его в фоновом режиме, затем введите пустую строку в оболочку, чтобы она проверила, была ли программа остановлена сигналом.Если процесс пытается прочитать с терминала, он сразу же получит
SIGTTIN
сигнал и будет приостановлен. (Когда контроль заданий включен, система позволяет только одному процессу одновременно считывать данные с терминала.) Оболочка сообщит об этом. Затем вы можете набрать,fg
чтобы продолжить процесс на переднем плане, а затем ввести ввод, который будет считан программой в обычном режиме.Некоторые программы, такие как редакторы, будут либо перехватывать, либо игнорировать сигнал, генерируемый Ctrl+Zтерминалом, либо переводить его в режим, в котором управляющие символы даже не генерируют сигналы. Вы должны будете использовать более сложные методы , в этом случае, например, с использованием ,
strace
чтобы увидеть , если процесс делаетread
,select
,poll
и т.д.источник