Як я можу додати до вже запущеного процесу додаткову команду 'shutdown'?


11

На регулярній основі я забуваю додати && shutdown -h nowдо тривалого процесу. Чи є спосіб додати shutdown -h nowкоманду після виклику першої команди? Він не призначений для переривання поточного процесу. Можливо, можна спостерігати PID?


Я сподіваюсь, ви зрозуміли, що все, що настане після &&цього, запуститься лише в тому випадку, якщо попередня команда була успішною. Якщо ви хочете, щоб він запускався, навіть якщо команда ;замість цього не використовується .
Зойк

Відповіді:


13

Немає необхідності багаторазово запускати ps, щоб перелічити всі процеси та проглядати результат. Виділіть процес ctrl-Z, а потім запустіть

bg %1 ; wait %1 ; shutdown -h now

Якщо у вас запущені інші фонові завдання, тоді вам буде надано інший taskpec замість [1], коли ви будете ctrl-z. Якщо так, використовуйте це замість цього.


3

Ви можете зробити щось подібне, яке перевірить, чи працює процес кожні 5 секунд, і вжити відповідних дій:

while true; do
  if ps -ef | grep -q '[l]ong-running-process'; then
    sleep 5
  else
    sudo poweroff
  fi
done

Зауважте у grepвиразі квадратні дужки . Це потрібно для того, щоб grepпроцес не відповідав, якщо він опинився в psсписку. Будь-якого окремого символу квадратними дужками достатньо.


+1, оскільки це працює. Не так, як я це зробив би.
Зойк

@Zoke: Якщо є інший спосіб, мені буде цікаво.
Скотт Северанс

Опублікував відповідь також. Перевірте це, якщо вам подобається.
Зоке

Ви також можете використовувати kill -0 (pid), щоб перевірити наявність процесу, не вбиваючи його.
пухнастий

3

Я роблю це постійно.

  1. Почніть процес.
  2. Зрозумій, що я забув виконати свою &&команду.
  3. Натисніть Ctrl+, Zщоб призупинити процес і повернутися до оболонки.
  4. Біг fg && shutdown -h nowдо:
    1. Передбачте і відновіть процес, який ви щойно призупинили.
    2. Потім, після закінчення, він запустить те, що ви хотіли запустити.

Крім того, ви можете опитувати, як пропонується в інших відповідях, таких як ця:

while ps -p $PID ; do sleep 5 ; done ; shutdown -h now

Це негайно припинить роботу.
psusi

Fg завершується одразу, тому ...
psusi

@psusi ні, не буде
Ходьба по Вікі

@WalkingWiki, о, дивно, ти маєш рацію. Клянусь, я перевірив це ще в 2012 році, і це було зроблено відразу.
psusi

1

Якщо ви знаєте pid, можете запустити це:

while ps -p $PID; sleep 5; done; shutdown -h now

Щоб запустити без відлуння від PS, зробіть це:

while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now

І нарешті запустити його у фоновому режимі без жодного виводу:

(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &

Рішення Скотта є хорошим, але це усуває необхідність grepзнову і знову, якщо ви вже знаєте pid. І ввести це набагато швидше.: P


0

Складіть скрипт оболонки для запуску обох процесів:

MyShellScript.txt:

#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now

Збереживши це в каталозі, де ви запускаєте даний процес, зробіть:

chmod +x MyShellScript.txt

Потім, коли ви хочете запустити команду, просто введіть, ./MyShellScript.txtі вона зробить і те, і інше.

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