Как узнать, какая команда выполняется без остановки?

20

В моем примере я запускаю команду, выполнение которой занимает очень много времени (несколько часов).

Я действительно не помню, вводил ли я make или make -j4.

Конечно, я мог бы остановить это и нажать клавишу вверх или проверить историю, чтобы узнать это, но это остановит процесс, и я не хочу, чтобы это произошло (если он уже выполняет make -j4).

Есть ли способ узнать, какая команда выполняется без остановки процесса?

Даниэль Виано
источник
5
С другого терминала попробуйтеpgrep -a make
John1024
2
В случае makeвы можете остановить и перезапустить его, и он должен забрать, где он остановился.
user253751

Ответы:

34

Если вы хотите видеть полную командную строку для каждого экземпляра make, запущенного на вашем компьютере, откройте новый терминал и попробуйте:

pgrep -a make

pgrepэто программа, которая просматривает все процессы на вашем компьютере. В этом случае он ищет названные программы make. Опция -aуказывает pgrepперечислять как идентификатор процесса, так и полную командную строку для каждого соответствующего процесса. (Без -aэтого он просто вернул бы идентификатор процесса.) Дополнительную информацию о многих опциях pgrep смотрите в разделе man pgrep.

John1024
источник
7
Это полезно для простых случаев, таких как вопрос. Однако если команда включает конвейеры, циклы, последовательности команд, внутренние команды или расширение переменной, то то, что вы найдете, pgrepбудет выглядеть иначе, чем команда, введенная в командной строке.
kasperd
28

Когда окно терминала активно, вы можете приостановить (приостановить) процесс, нажав Ctrl+ Z. Затем вы можете перенести задание в фоновом режиме, набрав bg(теперь ваше задание будет продолжаться в фоновом режиме, и вы можете одновременно работать с командной строкой; это эквивалентно запуску задания с &конца командной строки). Затем используйте стрелки курсора (вверх и вниз), чтобы увидеть, какую команду вы использовали. Если вы хотите (но это не обязательно), вы можете вывести свою работу на передний план, набрав fg.

Стефан
источник
7
Это работает с некоторыми командами, но не со всеми. Например, если вы наберете такой цикл, for X in {1..1000} ; do sleep $X ; doneто цикл будет прерван, а остальные итерации не произойдут.
kasperd
11
@kasperd Да, довольно раздражает, если вы спросите меня, но я нашел крутой обходной путь для этой проблемы. Окружите сложную команду, подобную этой, в круглых скобках, так что это подоболочка. Затем Ctrl-Z приостановит всю подоболочку и возобновит работу правильно.
penguin359
@kasperd Не в bash, но в zsh.
JoL
4
Не нужно переводить задание в фоновый режим: достаточно приостановить его, проверить историю (или jobs, как показано в ответе @ ichabod) и затем возобновить ее через fg.
Конрад Рудольф
10

Я делаю что-то вроде Стефана: ^ Z, чтобы приостановить работу, а затем бегу jobs. Если у вас запущено несколько процессов, вам, возможно, придется разобраться, какое задание было приостановлено, но это обычно дает командную строку. Затем бегите, fgчтобы продолжить выполнение.

Ихавод
источник
1

Хороший способ увидеть это динамически - это запустить top, и это говорит вам об общем состоянии системы и запущенных процессах в системе.

Выполнение ps ux показывает ваши процессы вместе с pid и другой информацией, вы можете использовать навык, чтобы убить некоторые из них, если хотите, справочная страница для этого - хороший ресурс, а выполнение навыка или kill -9 приводит к зависанию процессов. зависает в ожидании устройства и т. д. Вы также можете отправлять другие сигналы таким процессам, как -hup, перезапускать демоны и т. д.

Сверху приятно, так как он показывает размер процесса, затраченное время и текущие состояния процессора, а также память и своп.

Я часто делаю $ make> & make.out & и затем less или tail -f в файле журнала make.out. Поскольку сейчас make отключен как процесс от моего сеанса оболочки.


источник