Игрался сегодня с strace. Запускал в нём ping. Но пинг, запущенный таким образом, почему-то отказывался работать, возвращая ошибку:
elwood@elwood:~$ strace -o out ping ya.ru ping: icmp open socket: Operation not permitted
При этом просто пинг (без strace) вполне себе работал.
Почему так ?..
Выяснилось, что дело в особых правах на ping. Прикол в том, что для пинга установлен бит setuid:
elwood@elwood:~$ ls -l `which ping` -rwsr-xr-x 1 root root 44168 May 7 2014 /bin/ping
И при запуске он по сути работает от рута. А strace такими правами не обладает, и запуская ping через него, я получал ошибку. Если убрать setuid бит с /bin/ping, то при запуске ping я тоже буду получать ошибку:
elwood@elwood:~$ sudo chmod u-s `which ping` elwood@elwood:~$ ls -l `which ping` -rwxr-xr-x 1 root root 44168 May 7 2014 /bin/ping elwood@elwood:~$ ping ya.ru ping: icmp open socket: Operation not permitted
Решить проблему можно либо добавив setuid бит для strace (chmod u+s `which strace`
), либо запуская strace через sudo.
Когда я писал JCoro, наткнулся на неприятный баг, который не позволял полноценно поддерживать работу с лямбдами: часть type-аннотаций при компиляции просто не записывалась в class-файл. Возмущённый этим беспределом, пошёл тогда на оракловый багтрекер и выяснил, что иначе как через написание письма баг не засабмитить. Ушёл писать письмо. Написал письмо, отправил и стал ждать. Как оказалось, отлупы при рассмотрении таких писем не приходят, и ждал я тщетно. И вот сегодня вспомнил про эту шляпу и решил поискать ручками – а что, а вдруг ? И слава богам – бажулька действительно была принята и даже пофикшена ! Да вот только фикс приедет лишь в Java 9. Это.. это печально. К тому времени Kotlin может опередить jcoro 🙂 (хотя они ещё не взялись за свой async-await, а лишь зарезервировали ключевые слова).
Взялся тут за свои старые консольные поделки, обнаружил забавное поведение, если не отпускать мышь 🙂
0