以下の内容はhttps://iww.hateblo.jp/entry/20251017/systemdより取得しました。


systemdのsocketで、接続元のIPアドレスを取得する2

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);

docs.redhat.com

*1:ジャーナルで読めるIDとは記号がびみょーに違う




以上の内容はhttps://iww.hateblo.jp/entry/20251017/systemdより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14