Как получить pid последней выполняемой команды в сценарии оболочки?

Существует более простой способ того, что Вы делаете. Если Вы используете set -x, сценарий автоматически повторит каждую строку, прежде чем это будет выполнено.

Кроме того, как только Вы выполняете другую команду, $? заменяется кодом выхода той команды.

Необходимо будет поддержать его до переменной, если Вы собираетесь быть выполнением чего-нибудь с ним кроме быстрого тестировать-и-забывать. [ на самом деле программа, которая имеет ее собственный код выхода.

Например:

set -x # make sure the command echos
execute some command...
result="$?"
set +x # undo command echoing
if [ "$result" -ne 0 ]; then
    echo "Your command exited with non-zero status $result"
fi
266
25.08.2016, 14:11
4 ответа

PID последней выполняемой команды находится в $! переменная оболочки:

my-app &
echo $!
353
27.01.2020, 19:26
  • 1
    , Она печатает pid что касается, например, [1] 893. Я хочу только число. –  user3153014 04.09.2014, 14:47
  • 2
    Нужно отметить, что это обозначает программы, запущенные в фоновом режиме. Если никакие фоновые процессы не были запущены, параметр не устанавливается. –  ramrunner 17.11.2014, 23:52
  • 3
    Другое достойное решение предлагается в (комментарий к ответу на), Как получить pid просто запущенного процесса: о, и "острота": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24 ноября '10 в 14:28 –  imz -- Ivan Zakharyaschev 02.06.2015, 17:11
  • 4
    Строка @user3153014 s как" [2] 2625" печатается оболочкой после запуска фоновой задачи. Это не связано с выводом echo $! –  Petr Gladkikh 26.07.2015, 08:21

Попробуйте что-то вроде этого:

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

Размещение первой буквы процесса между [ ] удостоверяется, что Вы не добираетесь grep обработайте в своем списке. В случае необходимости можно также добавить grep на имени пользователя.

-4
27.01.2020, 19:26
  • 1
    Это очень хрупко в лучшем случае и не работает если my-app выполняется несколько раз - davidshen84, конкретно волнует по поводу той аварии –  Mat 30.01.2012, 14:10
  • 2
    Если Вы даже идете этим путем, необходимо использовать pgrep вместо этого. –  Willem 19.01.2015, 14:41

Получите 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)"
68
27.01.2020, 19:26

Попробуйте что-нибудь вроде

pidof my_app >> /tmp/my_app.pid
3
27.01.2020, 19:26

Теги

Похожие вопросы