LINUX.ORG.RU

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

 ,


1

1

Привет!

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

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

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

★★

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

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

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

Эх, я надеялся обойтись без временных файлов

Пропатчить sleep, добавить аргумент:

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

заменить на:

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

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

у меня это не матчится.

В htop мож проверить. Только ковычки исчезают, а в остальном - зер гуд.

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

У меня и в htop тишина.

Лажа у тебя какая то:

$ sh -c 'sleep 1000 # this-is-a-bad-idea'
$ pgrep -f this-is-a-bad-idea
28540

в htop:

28540 ................... sh -c sleep 1000 # this-is-a-bad-idea
anonymous
()
Ответ на: комментарий от rmu

И нет возможности самому давать задавать pid-ы. Хоть какое-то средство было бы для тэгирования.

rmu ★★
() автор топика
Ответ на: комментарий от 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 ★★
() автор топика
Ответ на: комментарий от i-rinat

Костыли-костылики!

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

[[ -z "$_SECOND" ]] && _SECOND=1 exec -a execa_1 bash "$0" "${@}"

pgrep -f execa_1
vodz ★★★★★
()

Можно сменить имя потоку, и искать по нему.

pon4ik ★★★★★
()
touch /tmp/3f06f84a2d70539d552fda449c51c863
sleep 1000 < /tmp/3f06f84a2d70539d552fda449c51c863
lsof /tmp/3f06f84a2d70539d552fda449c51c863
ls-h ★★★★★
()
Ответ на: комментарий от rmu

Знать бы от чего «лечить».

Попробуй напрямую dash вместо sh.

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

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

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

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

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

pgrep показывает на шелл. Конечно, если его прибить, его потомок sleep тоже завершается. Но вот пометить именно sleep так не выйдет.

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

Конечно, если его прибить, его потомок sleep тоже завершается.

Сколько ты не спал?

ABW ★★★★★
()
Ответ на: комментарий от 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)
Ответ на: комментарий от rmu

Но последний есть везде

Ээээ. Так мож sh (он тож есть везде) прокрутит у тебя? Хотя у меня (/bin/sh -> /bin/dash) не прокрутил.

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

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

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

Не совсем понял смысл твоего «прокрутит».

$ sh -c "exec -a sleep_tag1 sleep 30"
sh: 1: exec: -a: not found

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

zsh запускает процесс sleep 100, pgrep -f ни переменную ни её значение не матчит.

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

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

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

А кто у тебя sh, кстати?

lrwxrwxrwx 1 root root 4 ноя 13 20:31 /bin/sh -> bash
rmu ★★
() автор топика
Ответ на: комментарий от vodz

Так у меня работает, не знал что так можно делать. Пока не знаю зачем мне эта фигня, но выглядит полезным

I-Love-Microsoft ★★★★★
()
( sleep 10050 & echo $! >/tmp/sleep.pid && wait $! && rm -f /tmp/sleep.pid )

А вообще - выкидывайте этот ваш шелл.

vasily_pupkin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.