Делать, если честно, совсем ничего не хочется. Вчера, к примеру, закинули охуенную задачу — чтобы внести цифровой продукт в реестр отечественного ПО, нужно написать подробнейшую документацию к проекту.
Чтобы специалисты «миницифер» смогли локально у себя его развернуть и всё проверить.
Ну это ладно, вся соль в том, что нужно это подробно и в мельчайших подробностях расписать — без матов.
От начала создания сервера — консольные команды, пайплайны, апстримы, фаерволы и т. п. — и заканчивая: а теперь открываем браузер и видим главную страницу нашего приложения. Отдать код Ansible — не канает. Заебись, да?
Короче, пезда какая-то, чувствую себя как ребёнок, который ненавидит делать домашку. Ладно, лирика. Поехали по сегодняшней теме.
Как узнать, какие сигналы слушает процесс
Требуется проверить, поймает ли запущенный процесс сигнал, проигнорирует или заблокирует его. Короче, нужен список сигналов для конкретного приложения.
В Linux ты можешь найти PID процесса, а затем посмотреть:
cat /proc/$PID/status
В выхлопе будут строки, описывающие, какие сигналы:
- SigBlk — заблокированы;
- SigIgn — проигнорированы;
- SigCgt — перехвачены.
Для примера беру PID=1, получаю такое:
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
Роман, ты заебал! Опять какие-то шифры нечитабельные.
Давай разберёмся, что это значит
Все эти числа справа являются битовой маской. Если преобразовать это из шестнадцатеричного в двоичный, то каждый единичный бит представляет собой пойманный сигнал, считая справа налево, начиная с 1.
Итак, интерпретируя строку SigCgt, видим, что мой init-процесс улавливает следующие сигналы:
00000000280b2603 ==> 101000000010110010011000000011

Как сопоставить числовые сигналы с именами? Я выполнил команду:
kill -l
И получил список всех сигналов от 1–31, а дальше уже дело техники.
И помним, что мы не можем заблокировать сигнал, если программа не готова к его перехвату. Если сигнал не был пойман, происходит действие по умолчанию, обычно это завершение процесса.
Нахера всё это нужно? Ну, если ты рядовой потребитель, то, конечно, оно тебе и не нужно. А если ты «автомеханик», то, извините, хош не хош, а как оно внутри работает, знать обязан.
Вот те скрипт, который покажет, какие сигналы прослушивает программа. Да, скрипт преобразует криптошифры в нормальные имена сигналов. Избавляю вас от еботни, как говорится, всё для вас, мои дорогие подписчики.
#!/bin/bash
set -e
grep -m3 -P '^Sig(?:Blk|Ign|Cgt):' "/proc/$1/status" | while read field value
do
bits=$(printf 'ibase=16; obase=2; %X\n' '0x'$value | bc)
sigs=()
i=0
while [[ $bits ]]
do
((++i))
[[ ${bits:$((${#bits} - 1))} -eq 1 ]] && sigs+=($i)
bits=${bits::-1}
done
(( ${#sigs[*]} )) && sigs=( $(kill -l ${sigs[*]}) )
echo $field ${sigs[*]}
done
При запуске нужно указать PID процесса: script.sh <pid>.
Вроде всё. Если есть чё добавить, велком в комменты. Ну и всех с пятницей, хороших предстоящих выходных, берегите себя!
Пользуйтесь!








Комментарии
Виджет комментариев загружается с серверов Telegram и может использовать cookies. Разрешите внешние сервисы, чтобы открыть обсуждение.