1 /* SPDX-License-Identifier: LGPL-2.1+ */
6 #include "sd-messages.h"
8 #include "format-util.h"
9 #include "journal-authenticate.h"
10 #include "journald-kmsg.h"
11 #include "journald-server.h"
12 #include "journald-syslog.h"
13 #include "process-util.h"
16 int main(int argc
, char *argv
[]) {
17 const char *namespace;
22 log_error("This program takes one or no arguments.");
26 namespace = argc
> 1 ? empty_to_null(argv
[1]) : NULL
;
28 log_set_prohibit_ipc(true);
29 log_set_target(LOG_TARGET_AUTO
);
30 log_set_facility(LOG_SYSLOG
);
31 log_parse_environment();
38 r
= server_init(&server
, namespace);
42 server_vacuum(&server
, false);
43 server_flush_to_var(&server
, true);
44 server_flush_dev_kmsg(&server
);
47 log_debug("systemd-journald running as PID "PID_FMT
" for namespace '%s'.", getpid_cached(), server
.namespace);
49 log_debug("systemd-journald running as PID "PID_FMT
" for the system.", getpid_cached());
51 server_driver_message(&server
, 0,
52 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_START_STR
,
53 LOG_MESSAGE("Journal started"),
56 /* Make sure to send the usage message *after* flushing the
57 * journal so entries from the runtime journals are ordered
58 * before this message. See #4190 for some details. */
59 server_space_usage_message(&server
, NULL
);
62 usec_t t
= USEC_INFINITY
, n
;
64 r
= sd_event_get_state(server
.event
);
66 log_error_errno(r
, "Failed to get event loop state: %m");
69 if (r
== SD_EVENT_FINISHED
)
72 n
= now(CLOCK_REALTIME
);
74 if (server
.max_retention_usec
> 0 && server
.oldest_file_usec
> 0) {
76 /* The retention time is reached, so let's vacuum! */
77 if (server
.oldest_file_usec
+ server
.max_retention_usec
< n
) {
78 log_info("Retention time reached.");
79 server_rotate(&server
);
80 server_vacuum(&server
, false);
84 /* Calculate when to rotate the next time */
85 t
= server
.oldest_file_usec
+ server
.max_retention_usec
- n
;
89 if (server
.system_journal
) {
92 if (journal_file_next_evolve_usec(server
.system_journal
, &u
)) {
101 r
= sd_event_run(server
.event
, t
);
103 log_error_errno(r
, "Failed to run event loop: %m");
107 server_maybe_append_tags(&server
);
108 server_maybe_warn_forward_syslog_missed(&server
);
111 if (server
.namespace)
112 log_debug("systemd-journald stopped as PID "PID_FMT
" for namespace '%s'.", getpid_cached(), server
.namespace);
114 log_debug("systemd-journald stopped as PID "PID_FMT
" for the system.", getpid_cached());
116 server_driver_message(&server
, 0,
117 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_STOP_STR
,
118 LOG_MESSAGE("Journal stopped"),
122 server_done(&server
);
124 return r
< 0 ? EXIT_FAILURE
: EXIT_SUCCESS
;