Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: PID в ()  (Прочитано 699 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Cxms

  • Автор темы
  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
PID в ()
« : 04 Декабря 2015, 21:41:06 »
Можно ли получить PID субшелла (баш) при выполнении кода в ()?

Оффлайн spk-ubuntu

  • Активист
  • *
  • Сообщений: 502
    • Просмотр профиля
Re: PID в ()
« Ответ #1 : 04 Декабря 2015, 23:21:26 »
Насколько я понял, штатным образом никак.
Поэкспериментировав, пришёл к такому варианту:
Код: (bash) [Выделить]
#!/bin/bash
echo PID1 = $$
( spid=$(ps -o pid -h --ppid $$); echo PID2 = $spid; sleep 10 )
Но не могу сказать, что он сильно мне самому нравится.
А зачем Вам это нужно (помимо академического интереса)?

Оффлайн Cxms

  • Автор темы
  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: PID в ()
« Ответ #2 : 05 Декабря 2015, 03:20:05 »
Нужно сделать предупреждение (c zenity) если сценарий используется каким-то процессом(и).
+ вывод этих процессов, и выбор: выйти или убить их.
fuser не подходит.
Сделал так:
Код: (bash) [Выделить]
SCRIPT_PROCS="$(SPID=$BASHPID; ps ax -o pid,command | grep "$0" | grep -v grep | cut -d " " -f2 | sed "/$SPID/d; /$$/d")"

if [ -n "$SCRIPT_PROCS" ]; then
PROCS_NAMES="$(ps -o pid,command --pid $(echo "$SCRIPT_PROCS" | tr '\n' ' '))"
zenity --question --text "Ошибка запуска: Имеется процесс(ы) использующие этот сценарий:\n$PROCS_NAMES" --width=600 --ok-label "Убить и продолжить" --cancel-label "Выйти" || exit 0
echo "$SCRIPT_PROCS" | xargs kill -9
fi
Все работает.
« Последнее редактирование: 05 Декабря 2015, 11:17:03 от Cxms »

shura1

  • Гость
Re: PID в ()
« Ответ #3 : 05 Декабря 2015, 07:51:00 »

Оффлайн Cxms

  • Автор темы
  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: PID в ()
« Ответ #4 : 05 Декабря 2015, 08:25:09 »
Да, $BASHPID дает pid субшелла, но напрямую (как шаблон для удаления строки) ни grep ни sed его не принимали. Поэтому в начале SPID=$BASHPID
« Последнее редактирование: 05 Декабря 2015, 11:22:15 от Cxms »

 

Страница сгенерирована за 0.043 секунд. Запросов: 23.