вход сессии 'сценария' заставляет меня выйти дважды

[118687] Короче говоря, его нет.

В длину:

В Линуксе есть 2 типа труб, названных трубами (aka, fifo) и обычными трубами.

Названные трубы создаются с помощью [119088]mkfifo[119089] ([119090]man 3 mkfifo[119091]) системного вызова. Именованные каналы существуют в виде файлов в файловой системе. Один процесс открывает его для чтения, а другой для записи.

Обычные трубы создаются системным вызовом [119092]pipe[119093] ([119094]man 2 pipe[119095]). После открытия они ведут себя точно так же, как при открытии трубы mkfifo. Они берут дескриптор файла, один конец открыт для чтения, другой - для записи.

Так как они берут дескриптор файла, они появляются в [119096]/proc/PID/fd/[119097]. Но так как они нигде не существуют как настоящий файл, запись в [119098]/proc/PID/fd/[119099] должна сделать немного магии. Таким образом, в основном, труба становится представлена как сим-ссылка с фальшивой мишенью. Когда вы открываете сим-ссылку, ядро действительно открывает канал, который представлен сим-ссылкой. Но так как это симлинк, и у симлинков есть цели, все, что попытается разыменовать симлинк, вернет его обратно. Просто эта цель не указывает на действительный файл.

Обычно вы не можете сделать это с помощью симлинков, однако файловая система [119100]/proc[119101] не является обычной файловой системой. Это поддельная файловая система, представленная ядром. А так как содержимое создаётся ядром, то ядро может нарушить свои собственные правила.[118702].

2
13.04.2017, 15:36
1 ответ

По запросу. Следующее должно работать

[[ $(ps -ocommand= -p $PPID | awk '{print $1}') = script ]] || { script -f /var/log/shellog/$USER-$(date -u +%Y.%m.%d-%H:%M:%S).${HOSTNAME:-$(hostname)}.$$.log && exit ;} 
1
27.01.2020, 22:22

Теги

Похожие вопросы