Як знати, яка команда виконується, не зупиняючи її?


20

У своєму прикладі я запускаю команду, яка виконує дуже багато часу (кілька годин).

Я не дуже пам’ятаю, чи вводив я в make або make -j4.

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

Чи є спосіб дізнатися, яка команда виконується, не зупиняючи процес?


5
З іншого терміналу спробуйтеpgrep -a make
John1024

2
У випадку, якщо makeви можете зупинити його та перезапустити, він повинен вибрати місце, де він зупинився.
користувач253751

Відповіді:


34

Якщо ви хочете побачити повний командний рядок для кожного примірника makeзапущеного на вашому комп’ютері, відкрийте новий термінал і спробуйте:

pgrep -a make

pgrepце програма, яка здійснює пошук усіх процесів на вашому комп’ютері. У цьому випадку він шукає програми з назвою make. Цей параметр -aповідомляє, pgrepщоб перелічити як ідентифікатор процесу, так і повний командний рядок для кожного відповідного процесу. (Без -aцього було б просто повернути ідентифікатор процесу.) Докладнішу інформацію про багато варіантів pgrep див man pgrep.


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

Хороший спосіб динамічно це побачити - це запустити верх, і це говорить про загальний стан системи та запущені процеси в системі.

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

Зверху приємно, оскільки він показує розмір процесу, пройдений час та поточні стани процесора, а також пам’ять та заміну.

Я часто роблю $ make> & make.out &, а потім менше або хвіст -f у файлі журналу make.out. Оскільки тепер make відокремлюється як процес від моєї сесії оболонки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.