[systemd-devel] journal handling of process title changes
Patrick Donnelly
batrick at batbytes.com
Sun Mar 23 18:46:00 PDT 2014
[adding message to list, sorry Lennart...]
On Sun, Mar 23, 2014 at 9:25 PM, Lennart Poettering
<lennart at poettering.net> wrote:
> On Sun, 23.03.14 00:32, Patrick Donnelly (batrick at batbytes.com) wrote:
>
>> It seems the journal is reading from /proc/pid/cmdline (argv[0]) for
>> each entry. So when reading using journalctl, we don't see process
>> title changes properly. See the below example:
>
> We are reading both /proc/$PID/comm and /proc/$PID/cmdline, and augment
> journal entries with that. Unfortunately the kernel is currently too
> limited to do this in a race-free way. This means that a service that
> logs and terminates quickly afterwrads will trigger a race: journald
> won't be able to read comm and cmdline in time. Also, if you keep
> changing the comm/argv lines then we might use a later comm/argv for
> messages already written long before since we only read this data much
> later...
My problem is not related to race conditions. The issue is that
/proc/pid/cmdline is shown instead of /proc/pid/comm for each journal
entry. That is:
$ journalctl --boot
[...]
Mar 23 21:39:01 host a.out[10697]: hi
Mar 23 21:39:01 host c[10697]: bye2
[...]
These identifiers are being pulled from cmdline or argv[0] somehow.
>> #include <sys/prctl.h>
>> #include <systemd/sd-journal.h>
>>
>> int main (int argc, char *argv[])
>> {
>> printf("%d\n", prctl(PR_SET_NAME, "foo", 0, 0, 0));
>> sd_journal_print(LOG_INFO, "hi");
>> strcpy(argv[0], "abc");
>> sd_journal_print(LOG_INFO, "bye2");
>> return 0;
>> }
>>
>> gcc test.c -o a.out -lsystemd
>> ./a.out
>>
>> we see:
>>
>> ... a.out[10321]: hi
>> ... a.out[10321]: bye
>> ... c[10321]: bye2
>>
>> I don't see how after a cursory glance at the code, but systemd is
>> also magically remembering the "old" beginning of argv[0]. So, even if
>> I change argv[0], I must start my changes from the beginning of the
>> basename of the old title. So in the above example, "ab" replaced "./"
>> in argv[0], only "c" is printed in the log.
>>
>> It seems to me systemd should be using /proc/pid/comm for this.
>
> And we do. Can you please dump the respective lines with "-o verbose"
> from the journal? They should explain in detail what we are seeing
> there...
Sun 2014-03-23 21:39:01.932343 EDT
[s=485c69d197f74e3d855818a78b6d83b7;i=5d896;b=82f837d8221c4200bb8617f809638558;m=1459584e5;t=4f5504cd311bc;x=f318a8725568092f]
_MACHINE_ID=aae1a91de027484998daf076d8422b7e
_HOSTNAME=host
PRIORITY=6
_GID=100
_TRANSPORT=journal
_UID=1000
CODE_FUNC=main
MESSAGE=hi
CODE_FILE=test.c
CODE_LINE=7
SYSLOG_IDENTIFIER=a.out
_PID=10697
_BOOT_ID=82f837d8221c4200bb8617f809638558
_SOURCE_REALTIME_TIMESTAMP=1395625141932343
Sun 2014-03-23 21:39:01.932352 EDT
[s=485c69d197f74e3d855818a78b6d83b7;i=5d897;b=82f837d8221c4200bb8617f809638558;m=145958577;t=4f5504cd3124e;x=cfde456defb6c064]
_MACHINE_ID=aae1a91de027484998daf076d8422b7e
_HOSTNAME=host
PRIORITY=6
_GID=100
_TRANSPORT=journal
_UID=1000
CODE_FUNC=main
CODE_FILE=test.c
CODE_LINE=9
MESSAGE=bye2
SYSLOG_IDENTIFIER=c
_PID=10697
_BOOT_ID=82f837d8221c4200bb8617f809638558
_SOURCE_REALTIME_TIMESTAMP=1395625141932352
--
Patrick Donnelly
More information about the systemd-devel
mailing list