]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/journal/journald.c
man: fix incorrectly placed full stop
[thirdparty/systemd.git] / src / journal / journald.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #include <unistd.h>
4
5 #include "sd-daemon.h"
6 #include "sd-messages.h"
7
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"
14 #include "sigbus.h"
15
16 int main(int argc, char *argv[]) {
17 const char *namespace;
18 Server server;
19 int r;
20
21 if (argc > 2) {
22 log_error("This program takes one or no arguments.");
23 return EXIT_FAILURE;
24 }
25
26 namespace = argc > 1 ? empty_to_null(argv[1]) : NULL;
27
28 log_set_prohibit_ipc(true);
29 log_set_target(LOG_TARGET_AUTO);
30 log_set_facility(LOG_SYSLOG);
31 log_parse_environment();
32 log_open();
33
34 umask(0022);
35
36 sigbus_install();
37
38 r = server_init(&server, namespace);
39 if (r < 0)
40 goto finish;
41
42 server_vacuum(&server, false);
43 server_flush_to_var(&server, true);
44 server_flush_dev_kmsg(&server);
45
46 if (server.namespace)
47 log_debug("systemd-journald running as PID "PID_FMT" for namespace '%s'.", getpid_cached(), server.namespace);
48 else
49 log_debug("systemd-journald running as PID "PID_FMT" for the system.", getpid_cached());
50
51 server_driver_message(&server, 0,
52 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_START_STR,
53 LOG_MESSAGE("Journal started"),
54 NULL);
55
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);
60
61 for (;;) {
62 usec_t t = USEC_INFINITY, n;
63
64 r = sd_event_get_state(server.event);
65 if (r < 0) {
66 log_error_errno(r, "Failed to get event loop state: %m");
67 goto finish;
68 }
69 if (r == SD_EVENT_FINISHED)
70 break;
71
72 n = now(CLOCK_REALTIME);
73
74 if (server.max_retention_usec > 0 && server.oldest_file_usec > 0) {
75
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);
81 continue;
82 }
83
84 /* Calculate when to rotate the next time */
85 t = server.oldest_file_usec + server.max_retention_usec - n;
86 }
87
88 #if HAVE_GCRYPT
89 if (server.system_journal) {
90 usec_t u;
91
92 if (journal_file_next_evolve_usec(server.system_journal, &u)) {
93 if (n >= u)
94 t = 0;
95 else
96 t = MIN(t, u - n);
97 }
98 }
99 #endif
100
101 r = sd_event_run(server.event, t);
102 if (r < 0) {
103 log_error_errno(r, "Failed to run event loop: %m");
104 goto finish;
105 }
106
107 server_maybe_append_tags(&server);
108 server_maybe_warn_forward_syslog_missed(&server);
109 }
110
111 if (server.namespace)
112 log_debug("systemd-journald stopped as PID "PID_FMT" for namespace '%s'.", getpid_cached(), server.namespace);
113 else
114 log_debug("systemd-journald stopped as PID "PID_FMT" for the system.", getpid_cached());
115
116 server_driver_message(&server, 0,
117 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_STOP_STR,
118 LOG_MESSAGE("Journal stopped"),
119 NULL);
120
121 finish:
122 server_done(&server);
123
124 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
125 }