手法は色々出回っているがちょうど某サービスでcronジョブの途中でお亡くなりになっているプロセスがいるので便利コマンドを試しておく。
環境
php -v PHP 5.5.8 (cli) (built: Feb 4 2014 16:57:24) $ gdb -v GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6)
対象
2017年からご存命の6792さんを調べる
6777 0.0 0.0 275812 52 ? S 2017 0:00 php -q /home/xxxx/momochro.me/app/Console/cake.php -working /home/xxx/momochro.me/app update_and_notify -app /home/xxxx/momochro.me/app 6791 0.0 0.0 273184 200 ? S 2017 0:00 \_ /usr/local/bin/php /home/xxx/momochro.me/app/Console/do.php update_momo_items 6792 0.0 17.4 280772 177860 ? S 2017 0:00 \_ php -q /home/xxx/momochro.me/app/Console/cake.php -working /home/xxx/momochro.me/app update_momo_items -app /home/xxx/momochro.me/app
外から眺める
psで
$ ps -eopid,wchan:30,comm |grep 6792 6792 sk_wait_data php
sk_wait_dataで止まってる
sudo strace -p 6792 Process 6792 attached read(10,
lsofで
$ sudo lsof -i |grep 6792 php 6792 %USER% 10u IPv4 937985628 0t0 TCP %HOSTNAME%:42784->202x6x245x194:https (ESTABLISHED)
202x6x245x194にestablishedになってる。 ということでhttpsなリクエストの最中に死んでそう。
gdbで
phpソース直下の.gdbinitを読ませる
$ gdb -p 6792 --init-command=/usr/local/src/php-5.5.8/.gdbinit
(gdb) zbacktrace [0x7ff32cff5860] file_get_contents("https://api.dmm.com/affiliate/v3/ItemList?api_id=xxxxxx&affiliate_id=xxx.....") /home/xxx/momochro.me/app/Lib/MomoParser/DMMItemParser.php:29 [0x7ff32cff5640] DMMItemParser->getList() /home/xxx/momochro.me/app/Console/Command/UpdateMomoItemsShell.php:41 [0x7ff32cff5498] UpdateMomoItemsShell->main() /home/xxx/momochro.me/lib/Cake/Console/Shell.php:393 ...
file_get_contentsで雑にapi呼んでるところで止まってるのがわかる
$ dig +short api.dmm.com 202.6.245.194
上記をcoreを吐かせてgdbで
$ gcore 6792 $ gdb /usr/local/bin/php core.6792 --init-command=/usr/local/src/php-5.5.8/.gdbinit
参考諸々
だいたいここを参照