Як отримати під останньої виконаної команди в скрипті оболонки?


254

Я хочу мати такий сценарій оболонки:

my-app &
echo $my-app-pid

Але я не знаю, як отримати під щойно виконаної команди.

Я знаю, що можу просто скористатися jobs -p my-appкомандою, щоб зібрати під. Але якщо я хочу виконати оболонку кілька разів, цей спосіб не буде працювати. Тому що у робочих місць неоднозначно.

Відповіді:


338

PID останньої виконаної команди знаходиться в $!змінній оболонки:

my-app &
echo $!

1
Це друк pid, як наприклад. [1] 893. Я хочу лише номер.
user3153014

33
Слід зазначити, що це означає програми, розпочаті у фоновому режимі . Якщо фонових процесів не було запущено, параметр не встановлюється.
ramrunner

5
Ще одне гідне рішення пропонується в (коментар до відповіді). Як зрозуміти щойно розпочатий процес : о, і "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 листопада '10 о 14:28
imz - Іван Захарящев

14
@ user3153014 Рядок s типу "[2] 2625" друкується оболонкою після запуску фонового завдання. Це не пов'язано з результатамиecho $!
Петро Гладких

Зазвичай я використовую такий код у сценарії, коли мені потрібно почекати, поки процес закінчиться. my-app & myVar=$! ; fg. fgвиводить процес на перший план. Потім я можу надрукувати echo $myVarпізніше, і я впевнений, що мій додаток вже закінчено.
Vrata Blazek

66

Отримайте PID:

#!/bin/bash
my-app &
echo $!

Зберегти PIDв змінній:

#!/bin/bash
my-app &
export APP_PID=$!

Збережіть усі екземпляри PIDв текстовому файлі:

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid

Збережіть вихід, помилки та PIDв окремих файлах:

#!/bin/bash
my-app >/tmp/my-app.log 2>/tmp/my-app.error.log &
echo $! >>/tmp/my-app.pid

echo "my-app PID's: $(cat /tmp/my-app.pid)"

3
Питання не задавало питання про переадресацію, тоді ваша відповідь здебільшого така ж, як і прийнята, за винятком того, що якщо екземпляр my-appзакінчується, а може бути, і гірше, його PID буде повторно використаний пізніше, у вашому файлі з’явиться погана інформація. Я не думаю, що ця відповідь не надає особливої ​​цінності існуючій прийнятій відповіді
Ерік Реноф

Публікація @EricRenouf оновлена!
Едуардо Куомо

інша похідна, яка може бути корисною. Це отримує PID і в той же час трактує це як (здебільшого) процес переднього плану: sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?`
mlathe

хіба APP = main &спосіб захопити PID?
MrMesees

3

Спробуйте щось на кшталт

pidof my_app >> /tmp/my_app.pid

1
зовнішнє командування, і повільно, якщо система може давати PID безпосередньо, чому шукати через всі процеси, щоб знайти саме це? а також не можете бути впевнені, що ви отримаєте правильне значення
папо

-4

Спробуйте щось подібне:

 ps ef | grep "[m]y-app" | awk '{print $2}'

Якщо розмістити першу літеру свого процесу між собою [ ], ви не отримаєте цей grepпроцес у своєму списку. Якщо потрібно, ви можете також додати грейп до свого імені користувача.


9
Це в кращому випадку крихке і не спрацьовує, якщо my-appвоно виконується не один раз - Davidvidhen84 особливо переживає за цю казу.
Мат

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