[bash, linux] как именно работают &, ^Z, bg?

bleyman

Обесните в двух словах или же укажите, что читать.
Есть некая программа, про которую я думаю, что неплохо бы её иногда отрубать от терминала. А запускаю я её шеллскриптом, ибо все настройки идут через параметры.
Если я прям в самом скрипте указываю &, то всё вроде бы нормально, она у себя там в бэкграунде трудится, пишет что-то в лог и вообще. Но fg выполнить никак не возможно, чему я не особо и удивлён.
Если же я запускаю скрипт с &, или жму ^Z в процессе, то начинаются удивительные чудеса. Шеллскрипт перманентно живёт в состоянии паузы и не выходит из него невзирая на bg. Сама же прога, как удалось выяснить с помощью kill -s 11 и gdb (причём чуть не сошёл с ума на почве того, что точно помнил, что записывал когда-то ulimit -c unlimited в башрц, а оказалось, что нет висит где-то в недрах имплементации printf
Как так?

Serab

Ну, скрипт можно запускать так:
source spript.sh 

Не то?

Serab

С того времени, как писал шелл смутно припоминаю, что bg не должен срабатывать, если программа хочет читать из fd 0. При этом ее надо усыплять сразу.
Почему висит в printf, а не, скажем, в scanf — странно, ждем гуру.

macrophage

^Z - пауза и перевод в фон.
% - возвращает к жизни такие процессы.

Serab

он же писал про bg

bleyman

ага. По ходу баш не оверрайдит SIGTTOU, а моя прога же через него работает...
Ладно, не буду страдать извращениями, лучше спокойно демонизируюсь и сам к себе буду по именованному пайпу коннектиться, когда что-нибудь будет нужно.

vall

если надо чтоб просто работало — запускай через screen
эту юниксовую логику понять можно, но трудно запомнить нормальному человеку

Ivan8209

> Ладно, не буду страдать извращениями, лучше спокойно демонизируюсь
В терминалах путаются даже те, кто из отцов-основателей, они считают,
что код надо переписать или даже переделать.
---
"Верь сводке погоды, но доверяй --- интуиции.
Будь особенно бдителен, когда всё хорошо и нет поводов для тревоги."

klyv

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

Ivan8209

Этого никто не знает.
Возможно, это исправят тогда, когда терминалы вымрут полностью,
тогда код будет просто удалён.
---
Ибо нефиг.

bleyman

screen, он это... Ты пробовал когда-нибудь в нём mc запускать?

vall

не пробовал. но на первый взгляд всё работает.
только с ресайзом какие-то глюки, лучше не ресайзить после запуска ncurses прог =)

Ivan8209

> лучше не ресайзить после запуска ncurses прог
Они прокляты.
---
"This user is BSD-compliant."

Werdna

Есть некая программа, про которую я думаю, что неплохо бы её иногда отрубать от терминала.
Демонизируй, и не морочь голову.
setsid/fork/fclose(stderr,stdin,stdout)
Если демонизировать не можешь — nohup you_proga &

bleyman

bump!
А вот ещё вопрос: как мне с демоном-то общаться? System V IPC меня как-то вымораживает методом получения IPC key (в который в частности входит вызов realpath, у которой совершенно замечательный раздел BUGS, вытеснивший на второе место оный fdisk'a в моём личном чарте отличных разделов BUGS). Named pipes не нравятся тем, что опять же надо их как-то привязывать к ФС непонятно где, во-вторых, оно не закрывается само после смерти создателя. Сокеты не нравятся тем, что номер порта - число.
Есть ли ещё варианты? Или, может быть, недостатки этих можно как-то превозмочь, ну, понятно, что я бы хотел сделать именованную (строкой!) фигню (мимо пролетает IPC и сокеты которая принадлежала бы конкретному процессу (мимо пролетают пайпы короче говоря виндовые named pipes на самом деле, но вдруг есть какие-то хитрые опции?

vall

netlink! =)
чем тебе unix-сокеты не нравятся?

bleyman

Я ж говорю, тем, что номер порта - это число. Поэтому вместо интуитивно-понятного `CreateNamedPipe("\\\\.\\myappname_pipe", ...)` с не менее интуитивно-понятными сообщениями об ошибке (такой-то пайп уже существует, используйте параметр чтобы изменить имя на, например, myappname_pipe2) мне нужно от балды выбрать число и в случае коллизии предлагать юзеру самому выбрать число от балды же. Это отвратительно.
Я всё более склоняюсь к обычным named pipes, хоть они и убоги ужасно, но тогда интересно: куда их вообще класть?

vall

а! ты путаешь inet-сокеты и unix (domain) -сокеты! =)
как вариант добавлять пид на конец. если у тебя сервер живёт во множественных копиях то тебе всё равно надо как-то их нумеровать.
кладут их обычно в /var/run или /tmp

bleyman

unix (domain)
О! Вот это то, что нужно! Спасибо!

Ivan8209

> System V IPC
Никогда не делай это.
И вообще забудь, что это было.
Если хочешь работать на этом уровне, используй AF_LOCAL сокеты.
---
Q6: Я слышал есть такой мужик, вроде Бармин зовут, и он
придумал что-то такое после чего XXX не сосет.

Werdna

> System V IPC
Никогда не делай это.
И вообще забудь, что это было.
Почему же? Шареная память и семафоры — это прикольно.

Ivan8209

> Почему же? Шареная память и семафоры — это прикольно.
Энтомологией увлекаешься?
---
Q8: А где это есть и круче?
A8: В VMS!

vall

posix ipc лучше? или претензии к использованию ipc между неродственными процессами?

Ivan8209

> posix ipc лучше?
Хрен редьки не слаще:

APPLICATION USAGE

The POSIX Realtime Extension defines alternative interfaces
for interprocess communication. Application developers who
need to use IPC should design their applications so that
modules using the IPC routines described in XSI Interprocess
Communication can be easily modified to use the alternative
interfaces.

Нынешнего под рукой нет, так что звиняй --- SUSv3.
---
<<Сколько ни повторяй: "Халва, халва,"--- во рту сладко не станет.>>

bleyman

Ну я как бы на этом и остановился, да.
Вот раз ты (и все остальные) такой умный (-ые расскажите, что мне делать в следующих случаях:
1) прога запускается и видит, что $HOME/program_name.socket уже существует. Либо это предыдущую инкарнацию недружественно убили, а то и сама упала, не успев подчиститься, тогда надо unlink и ретрай, либо далбайоп запустил вторую копию, в этом случае надо объяснить ему его неправоту. Попытаться изобразить из себя клиента и послать туда пинг?
2) прога запускается, далбайоп удаляет (то есть анлинкает) соответствующую ноду. И может быть даже пытается запустить ещё одну копию программы. Первый инстанс должен а) забить, б) иногда проверять существование файла и пересоздавать сокет в случае отсутствия, в) проверять существование файла и его соответствие именно его сокету, хз как?
Как всё в юниксе через жопу всё-таки. И ведь чувствую, что нельзя мне использовать линуховые особые начинающиеся с \0 имена, которые вроде бы почти как в венде, потому что обязательно вдруг обнаружится, что есть клиент с соляркой какой-нибудь.

vall

Give people rope to shoot themselves is a Unix tradition (c) akpm

Ivan8209

> 1) прога запускается и видит, что $HOME/program_name.socket уже существует.
1. Прога должна проверить PID file, это уже отработано и вылизано.
2. Предыдущий шаг делается стартовыми скриптами. Пользователю,
желающему выполнять напрямую руками то, что ему не положено,
надо ампутировать конечности. См. (1).
3. Если ты используешь правильные скрипты или библиотеки,
и твоя прога видит существующий сокет, его можно свободно
удалять, ибо нефиг. Или повторно использовать, что то же самое.
> Попытаться изобразить из себя клиента и послать туда пинг?
Если ты хочешь делать эту часть руками, да.
> 2) прога запускается, далбайоп удаляет (то есть анлинкает)
> соответствующую ноду. И может быть даже пытается запустить ещё
> одну копию программы. Первый инстанс должен а) забить,
Написать об этом в syslog и только после --- забить.
> б) иногда проверять существование файла и пересоздавать сокет
> в случае отсутствия,
Неудобно для администратора. Иногда опытные люди играются с
этими нашими временно существующими безымянными файлами.
> в) проверять существование файла и его соответствие именно его
> сокету, хз как?
Надо думать. Для затравки: stat(2 getsockname(2 getpeername(2).
Ссылки:
1. LART: Luser Attitude Readjustment Tool. Something large,
heavy, and painful.
---
...Я работаю антинаучным аферистом...

Ivan8209

> $HOME/program_name.socket
Да, и не складывай временные файлы в ${HOME}, их место --- в ${TMPDIR:-/tmp}.
---
"This user is BSD-compliant."

Marinavo_0507

прога запускается, далбайоп удаляет (то есть анлинкает) соответствующую ноду.
С таким же успехом далбайоп может удалить исполняемый файл проги, или её конфиг, или плагин какой нужный. Против долпайопства техника бессильна.
Попытаться изобразить из себя клиента и послать туда пинг?
Способ хороший. Даже очень. Если на сокете уже никто не слушает, ошибка будет обязательно и сразу (но лучше уточни по мануалу это).
Большинство сервисов не слушают на AF_UNIX-сокетах, и потому требуют шаманства с pid-файлами, как написал Контра. Это менее надёжный способ.

Marinavo_0507

Энтомологией увлекаешься?
А что не так с shm? Несколько раз пользовался и имел успех, считаю получившийся код хорошим.

Marinavo_0507

И ведь чувствую, что нельзя мне использовать линуховые особые начинающиеся с \0 имена, которые вроде бы почти как в венде,
Это глобальный плоский неймспейс, а ты хочешь положить туда сервис, запускаемый пользователем, который, следовательно, может быть
(1) запущен разными пользователями несколько раз,
(2) нужно проверять права пользователей на доступ к сокету (правда, бздя этого афаик традиционно не делает, так что рассчитывать нельзя, если код не линукс онли).

Ivan8209

> правда, бздя этого афаик традиционно не делает
Чё?

su root -c 'chmod o-w /var/run/log'
logger test
su nobody -c 'logger test'
su root -c 'chmod o+w /var/run/log'
tail /var/log/messages

---
"This user is BSD-compliant."

Marinavo_0507

ну может, разработчики твоей малораспространённой системы таки увидели свет
а традиционно - права игнорируются, гугл например тут же находит http://www.sunmanagers.org/pipermail/summaries/2005-February...
и да, можно использовать права на директорию, как там советуют, так что мой пункт 2 в силе

Ivan8209

> ну может, разработчики твоей малораспространённой системы таки увидели свет
Я проверял на FreeBSD 6.3-STABLE i386.
> а традиционно - права игнорируются
Да с тобой только чёрт разберёт, что традиционно, что нет,
у тебя и mount суидный. И тоже --- традиционно.
---
"This user is BSD-compliant."

margadon

+1 shm довольно надёжная штука
и весьма быстрая
Оставить комментарий
Имя или ник:
Комментарий: