1

Мне нужно извлечь только номер процесса bash script_c.sh из этого вывода:

11545 pts/3    S+     0:00 bash script_c.sh
11625 pts/3    S+     0:00 grep script_c.sh

в этом случае это будет: 11545

я пытался

PROCESS=$(ps ax | grep 'bash script_c.sh' | cut -d' ' -f1 | tr -d ' ' | sed '/^$/d')

После этого я должен убить его, используя kill $PROCESS , но он не работает должным образом, он говорит: «Должно быть, это работа и т.д. ...».

2 ответа2

2

Классический инструмент для извлечения колонн cut .

pgrep -fl 'bash script_c.sh' | cut -f1 -d" "

извлечет первый столбец, разделенный пробелами. Это должно на самом деле делать то, что вы хотели. Тем не менее, большая хитрость заключалась в том, что я использовал pgrep , у которого гораздо более приятный вывод. Если бы я не добавил ключ -l , не было бы необходимости cut:

pgrep -f 'bash script_c.sh'

Однако для вашей конкретной задачи вы можете просто использовать pkill .

Это позволяет убивать процессы по шаблону, например

pkill -f "script_c.sh"

Большим преимуществом является то , что pgrep и pkill осознают себя, и только выход / убить соответствие других процессов. В приведенном выше примере у вас будут ложные срабатывания, например, команда grep . Так что просто используйте pkill который должен быть доступен в любой современной системе Linux / BSD.

Если вы действительно хотите использовать ps (что я не рекомендую):

 ps ax | grep script_c.sh | grep -v grep | sed -e 's/^ *\([0-9]*\) .*/\1/'

или даже лучше с awk (что лучше при автоматическом разборе макета столбца ps):

  ps ax | awk '!/awk/ && /script_c.sh/ { print $1 }'

Обратите внимание, что для обоих вы должны убедиться, что вы не соответствуете себе, т.е. исключить grep и awk из соответствия. Таким образом, использование pgrep существенно проще. И pgrep и pkill - правильные инструменты для решения вашей актуальной проблемы.

0

Попробуй это:

PROCESS=$(ps ax | grep 'bash script_c.sh' | sed 's/\([0-9]*\).*/\1/')

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .