systemdのsocketで、プロセスが起動されるとき サービスにはインスタンスIDというのが振られる
たとえば hoge@.service の場合、@の後ろにIDが振られて 実際に起動するサービスは
hoge@987-192.168.101.88:30000-192.168.101.89:57772.service
となる。
このインスタンスIDは、ユニット指定子 %I で取得できる
[Unit] Description=Hogehoge Service Instance %i [Service] ExecStart = /opt/hoge/bin/hogehoge -i "%I" StandardInput = socket StandardOutput = socket StandardError = journal
プログラムの中では次のように見える *1
987/192.168.101.88:30000/192.168.101.89:57772
プロセスID / 接続先IP:接続先ポート / 接続元IP:接続元ポート
これを、sscanfとかで適当に切り分ければ接続元IPアドレスが取得できる。 やったぜ
int pid; char remoteip[64]; sscanf(buf, "%d/%*[^:]:%*d/%63[^:]:%*d", &pid, remoteip); printf("PID=%d, REMOTE='%s'\n", pid, remoteip);
*1:ジャーナルで読めるIDとは記号がびみょーに違う