Процесс убийства в Shell Script - PullRequest
7 голосов
/ 04 июня 2009

У меня очень простая проблема: когда я запускаю скрипт оболочки, я запускаю программу, которая работает в бесконечном цикле. Через некоторое время я хочу остановить эту программу, прежде чем я могу это снова с разными параметрами. Вопрос теперь в том, как мне найти пид программа, когда я ее выполняю? По сути, я хочу сделать что-то подобное:

echo "Executing app1 with param1"  
./app1 param1 &  
echo "Executing app1"  
..do some other stuff  
#kill somehow app1
echo "Execution of app1 finished!"

Спасибо! * * 1004

Ответы [ 7 ]

15 голосов
/ 04 июня 2009

В большинстве оболочек (включая Bourne и C) PID последнего подпроцесса, запущенного вами в фоновом режиме, будет храниться в специальной переменной $!.

#!/bin/bash
./app1 &
PID=$!
# ...
kill $PID

Здесь имеется некоторая информация в разделе «Специальные переменные».

5 голосов
/ 04 июня 2009

В bash $! расширяется до PID последнего процесса, запущенного в фоновом режиме. Так что вы можете сделать:

./app1 param1 &
APP1PID=$!
# ...
kill $APP1PID
3 голосов
/ 04 июня 2009

Если вы хотите узнать PID процесса, вы можете использовать ps:

[user@desktop ~]$ ps h -o pid -C app1

параметр -o pid говорит, что вам нужен только PID процесса, -C app1 указывает имя процесса, который вы хотите запросить, а параметр h используется для подавления заголовка таблицы результатов ( без него вы бы увидели заголовок «PID» над самим PID). не то, что если существует более одного процесса с одинаковым именем, будут показаны все PID.

если вы хотите убить этот процесс, вы можете использовать:

[user@desktop ~]$ kill `ps h -o pid -C app1`

хотя killall чище, если вы просто хотите это сделать (и если вы не против убить все процессы "app1"). Вы также можете использовать head или tail, если вам нужен только первый или последний PID соответственно.

и подсказка для рыбы пользователей: %process заменяется на PID process. Итак, в рыбе вы можете использовать:

user@desktop ~> kill %app1
2 голосов
/ 04 июня 2009

вы получаете pid app1 с

ps ux | awk '/app1/ && !/awk/ {print $2}'

и тогда вы сможете убить его .... (однако, если у вас есть несколько экземпляров app1, вы можете убить их всех)

1 голос
/ 04 июня 2009
pidof app1
pkill -f app1
0 голосов
/ 05 августа 2014

У меня была проблема, когда процесс, который я убивал, был скриптом Python, и у меня был другой скрипт, который также выполнял Python. Я не хотел убивать питона из-за другого скрипта.

Я использовал awk для решения этой проблемы (пусть myscript будет вашим скриптом на python): убить ps -ef|grep 'python myscript.py'|awk '!/awk/ && !/grep/ {print $2}'

Возможно, это не так эффективно, но я бы предпочел обменять эффективность на универсальность в такой задаче.

0 голосов
/ 04 июня 2009
killall app1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...