Началось всё с чего: одна очень нужная прога на культях с клиент-серверной моделью (сервер создаёт сокет и потом запускает клиент, передавая ему параметром ID сокета) перестала запускать клиент. И было сие не один раз, после нескольких часов танцев с бубном как-то само устранялось. Без параметров клиент тут же сегфолтился, и я не был уверен, происходит ли это из-за отсутствия параметра или он вообще сегфолтился в эти дни периоды.
Смотрел strace клиента, но безрезультативно; перед смертью процесс пытался читать файлы сокетов в /tmp и падал. Только сегодня поскроллил чуть выше и заметил, что на одном из таких обращений кидает ENOSPC. Немного посёрчив, как такое может быть, и неоднократно убедившись, что лимит SHM у меня запредельный, начал копать, как её может не хватать фактически.
И докопался. В ipcs -a было четыре тысячи записей. Соорудил скрипт для очистки сирот (с nattch=0):
ipcs -a|awk '{printf $2" "$6"\n"}'|grep ' 0$'|col1|while read a; do ipcrm -m "$a"; done
Вопросы:
1) как я докатился до такой жизни? В интернетах пышуть, что сегмент может осиротеть при краше использующих ему процессов. Но это ж сколько их должно было накрашиться? Может, у меня руки из задницы и я (или какая-то говнософтина) что-то делаю не так?
2) какого хрена оно само не чистится, почему я должен пердолить скрипты? Хорошо, что я умею, а какой-нибудь убунтёнок поднял бы визг, и ему ничем бы не смогли помочь, потому что проблема локальная и трудновоспроизводимая
3) насколько ССЗБизм вот так чистить? Вдруг лишнего вычищу и кого-то запущенного поломаю.