If the GetMyExternalIP provider hasn't answered, bitcoind can't be stopped gracefully.
It looks like #3372 did not fix this, because boost interrupt() doesn't actually interrupt recv(), it just causes an exception at the next boost interruption point.
Thread in bitcoind that won't die:
(gdb) thread 6
[Switching to thread 6 (Thread 0x7f5818b7a700 (LWP 5569))]
[#0](/bitcoin-bitcoin/0/) 0x00007f581db6814c in recv () from /lib/x86_64-linux-gnu/libpthread.so.0
(gdb) bt
[#0](/bitcoin-bitcoin/0/) 0x00007f581db6814c in recv () from /lib/x86_64-linux-gnu/libpthread.so.0
[#1](/bitcoin-bitcoin/1/) 0x00007f581eccd213 in recv (__flags=0, __n=1, __buf=0x7f5818b79a56, __fd=23)
at /usr/include/x86_64-linux-gnu/bits/socket2.h:45
[#2](/bitcoin-bitcoin/2/) RecvLine (hSocket=23, strLine=...) at net.cpp:153
[#3](/bitcoin-bitcoin/3/) 0x00007f581eccd541 in GetMyExternalIP2 (addrConnect=...,
pszGet=0x7f581ee9dcd8 "GET / HTTP/1.1\r\nHost: checkip.dyndns.org\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\nConnection: close\r\n\r\n", pszKeyword=0x7f581ee9d976 "Address:", ipRet=...) at net.cpp:318
[#4](/bitcoin-bitcoin/4/) 0x00007f581eccdb14 in GetMyExternalIP (ipRet=...) at net.cpp:407
[#5](/bitcoin-bitcoin/5/) 0x00007f581eccdeb8 in ThreadGetMyExternalIP () at net.cpp:417
[#6](/bitcoin-bitcoin/6/) 0x00007f581ece128a in TraceThread<void (*)()> (name=0x7f581ee9dada "ext-ip",
func=0x7f581eccde90 <ThreadGetMyExternalIP()>) at util.h:544
[#7](/bitcoin-bitcoin/7/) 0x00007f581e111ce9 in thread_proxy () from /usr/lib/libboost_thread.so.1.46.1
[#8](/bitcoin-bitcoin/8/) 0x00007f581db60e9a in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
[#9](/bitcoin-bitcoin/9/) 0x00007f581ca423fd in clone () from /lib/x86_64-linux-gnu/libc.so.6
[#10](/bitcoin-bitcoin/10/) 0x0000000000000000 in ?? ()