LINUX.ORG.RU

Добавить комментарий (тэг) к программе, запускаемой в bash

 ,


1

1

Привет!

Нужно каким-нибудь образом пометить sleep, чтобы он матчился, например, с помощью pgrep -f "sleep 20 #tag1", как-нибудь так. Может быть запущено параллельно несколько sleep 20, требуется их как-то различать.

Надеюсь, идея понятна. Существует ли подходящий инструмент?

Заранее благодарю!

★★

foo &
FOO_PID=$!
# do other stuff
kill $FOO_PID

https://stackoverflow.com/questions/1908610/how-to-get-pid-of-background-process

При запуске программы в фоне можно сразу после её запуска получить её PID, записывый эти PID в файл, дописывая пометки и далее grep`ом выбирай из файла PID и убивай.

anonymous ()
Ответ на: комментарий от anonymous

Массив «виден» только внутри одной копии шела, даже из $() его уже не прочитать. Видимо, прийдётся временный файл создавать. Механизм тегов мог бы сделать фильтрацию процессов удобнее.

rmu ★★ ()
Ответ на: комментарий от anonymous

заменить на:

Псмотрел сырцу, и оказалось, что не прав, sleep на кой то ляд не один параметр пользует, а все, которые в него пиханёшь. Дурь какая то.

anonymous ()
Ответ на: комментарий от zolden

На стэковерфлоу нашёл пример с парсингом временных переменных окружения:

#!/bin/sh
_TAG=d726cc7fa57a308afdc057b228a13f6d
case "$1" in
start)
  _TAG=$_TAG ./self-backgrounding-process
  _TAG=$_TAG ./non-self-backgrounding-process &
  ;;
stop)
  pids=$(grep -l "\b_TAG=$_TAG\b" /proc/*/environ | cut -d/ -f3)
  [ -n "$pids" ] && kill $pids
  ;;
esac

Даже не знаю, на сколько это заслуживающий доверия вариант.

rmu ★★ ()
Ответ на: комментарий от rmu

Не знаю почему

Видимо, потому что это не работает. Ночью мне казалось, что работает, но там ведь матчится только процесс шела. Шел выбрасывает комментарий и sleep уже запускается без всего.

В общем, это было нерабочее решение.

i-rinat ★★★★★ ()
Ответ на: комментарий от vodz

Это потому что bash не знаете, нет никаких костылей, эту задачу bash тоже решает

Спасибо, дорогой @vodz!
exec -a полностью решил мою задачу! Командуя:

bash -c "exec -a sleep_tag1 sleep 30"

sleep выполняет свою функцию паузы в скрипте, и в то же время процессу даётся нужное мне имя, не засираются переменные окружения, не создаются вручную pid-файлы, процесс легко матчится по имени (тем же pidof), сохраняется лёгкая портируемость на другие машины, ибо built-in. Супер!

Сердечное спасибо.

rmu ★★ ()
Ответ на: комментарий от anonymous

У меня zsh,

zsh -c "exec -a sleep_tag1 sleep 30"

работает также, как и с bash. Но последний есть везде, поэтому я его оставлю. Не, пусть sh будет, проверил – эффект тот же.

rmu ★★ ()
Последнее исправление: rmu (всего исправлений: 1)
Ответ на: комментарий от anonymous

Не совсем понял смысл твоего «прокрутит». Без проверки работоспособности скрипта на конкретной машине я дело не оставлю, само собой разумеется.

rmu ★★ ()
Ответ на: комментарий от anonymous
sh -c 'sleep 100; echo "TAG=bla-bla-bla"'

Да, это работает. Но, как я писал выше, мне понравился вариант exec -a, потому что он позволяет находить процесс по имени, и без костыляния.

rmu ★★ ()