1
0
mirror of https://github.com/systemd/systemd.git synced 2025-02-23 13:57:33 +03:00

Merge pull request #13037 from poettering/shutdown-log-fixes

Shutdown log fixes
This commit is contained in:
Yu Watanabe 2019-07-13 23:00:12 +09:00 committed by GitHub
commit f7f196adfa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 60 additions and 55 deletions

View File

@ -78,27 +78,30 @@ static bool ignore_proc(pid_t pid, bool warn_rootfs) {
}
static void log_children_no_yet_killed(Set *pids) {
void *p;
Iterator i;
_cleanup_free_ char *lst_child = NULL;
Iterator i;
void *p;
SET_FOREACH(p, pids, i) {
_cleanup_free_ char *s = NULL;
if (get_process_comm(PTR_TO_PID(p), &s) == 0) {
if (!strextend(&lst_child, ", ", s, NULL))
break;
if (get_process_comm(PTR_TO_PID(p), &s) < 0)
(void) asprintf(&s, PID_FMT, PTR_TO_PID(p));
if (!strextend(&lst_child, ", ", s, NULL)) {
log_oom();
return;
}
}
if (!isempty(lst_child))
log_notice("Waiting for process:%s", lst_child + 1);
if (isempty(lst_child))
return;
log_warning("Waiting for process: %s", lst_child + 2);
}
static int wait_for_children(Set *pids, sigset_t *mask, usec_t timeout) {
usec_t until;
usec_t date_log_child;
usec_t n;
usec_t until, date_log_child, n;
assert(mask);

View File

@ -1072,27 +1072,17 @@ static void bump_file_max_and_nr_open(void) {
* hard) the only ones that really matter. */
#if BUMP_PROC_SYS_FS_FILE_MAX || BUMP_PROC_SYS_FS_NR_OPEN
_cleanup_free_ char *t = NULL;
int r;
#endif
#if BUMP_PROC_SYS_FS_FILE_MAX
/* The maximum the kernel allows for this since 5.2 is LONG_MAX, use that. (Previously thing where
* different but the operation would fail silently.) */
if (asprintf(&t, "%li\n", LONG_MAX) < 0) {
log_oom();
return;
}
r = sysctl_write("fs/file-max", t);
r = sysctl_writef("fs/file-max", "%li\n", LONG_MAX);
if (r < 0)
log_full_errno(IN_SET(r, -EROFS, -EPERM, -EACCES) ? LOG_DEBUG : LOG_WARNING, r, "Failed to bump fs.file-max, ignoring: %m");
#endif
#if BUMP_PROC_SYS_FS_FILE_MAX && BUMP_PROC_SYS_FS_NR_OPEN
t = mfree(t);
#endif
#if BUMP_PROC_SYS_FS_NR_OPEN
int v = INT_MAX;
@ -1122,13 +1112,7 @@ static void bump_file_max_and_nr_open(void) {
break;
}
if (asprintf(&t, "%i\n", v) < 0) {
log_oom();
return;
}
r = sysctl_write("fs/nr_open", t);
t = mfree(t);
r = sysctl_writef("fs/nr_open", "%i\n", v);
if (r == -EINVAL) {
log_debug("Couldn't write fs.nr_open as %i, halving it.", v);
v /= 2;

View File

@ -60,6 +60,21 @@ int sysctl_write(const char *property, const char *value) {
return 0;
}
int sysctl_writef(const char *property, const char *format, ...) {
_cleanup_free_ char *v = NULL;
va_list ap;
int r;
va_start(ap, format);
r = vasprintf(&v, format, ap);
va_end(ap);
if (r < 0)
return -ENOMEM;
return sysctl_write(property, v);
}
int sysctl_write_ip_property(int af, const char *ifname, const char *property, const char *value) {
const char *p;

View File

@ -11,6 +11,7 @@
char *sysctl_normalize(char *s);
int sysctl_read(const char *property, char **value);
int sysctl_write(const char *property, const char *value);
int sysctl_writef(const char *propery, const char *format, ...) _printf_(2, 3);
int sysctl_read_ip_property(int af, const char *ifname, const char *property, char **ret);
int sysctl_write_ip_property(int af, const char *ifname, const char *property, const char *value);

View File

@ -258,7 +258,7 @@ static void sync_with_progress(void) {
static int read_current_sysctl_printk_log_level(void) {
_cleanup_free_ char *sysctl_printk_vals = NULL, *sysctl_printk_curr = NULL;
unsigned current_lvl = 0;
int current_lvl;
const char *p;
int r;
@ -268,38 +268,38 @@ static int read_current_sysctl_printk_log_level(void) {
p = sysctl_printk_vals;
r = extract_first_word(&p, &sysctl_printk_curr, NULL, 0);
if (r > 0)
r = safe_atou(sysctl_printk_curr, &current_lvl);
else if (r == 0)
r = -EINVAL;
if (r < 0)
return log_debug_errno(r, "Unexpected sysctl kernel.printk content: %s", sysctl_printk_vals);
return log_debug_errno(r, "Failed to split out kernel printk priority: %m");
if (r == 0)
return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Short read while reading kernel.printk sysctl");
r = safe_atoi(sysctl_printk_curr, &current_lvl);
if (r < 0)
return log_debug_errno(r, "Failed to parse kernel.printk sysctl: %s", sysctl_printk_vals);
return current_lvl;
}
static void bump_sysctl_printk_log_level(int min_level) {
int current_lvl, r;
/* Set the logging level to be able to see messages with log level smaller or equal to min_level */
int current_lvl = read_current_sysctl_printk_log_level();
if (current_lvl >= 0 && current_lvl <= min_level) {
char buf[DECIMAL_STR_MAX(int)];
xsprintf(buf, "%d", min_level + 1);
int r = sysctl_write("kernel/printk", buf);
if (r < 0)
log_debug_errno(r, "Failed to bump kernel.printk to %s: %m", buf);
}
current_lvl = read_current_sysctl_printk_log_level();
if (current_lvl < 0 || current_lvl >= min_level + 1)
return;
r = sysctl_writef("kernel/printk", "%i", min_level + 1);
if (r < 0)
log_debug_errno(r, "Failed to bump kernel.printk to %i: %m", min_level + 1);
}
int main(int argc, char *argv[]) {
bool need_umount, need_swapoff, need_loop_detach, need_dm_detach;
bool in_container, use_watchdog = false, can_initrd;
bool need_umount, need_swapoff, need_loop_detach, need_dm_detach, in_container, use_watchdog = false, can_initrd;
_cleanup_free_ char *cgroup = NULL;
char *arguments[3];
char *arguments[3], *watchdog_device;
int cmd, r, umount_log_level = LOG_INFO;
static const char* const dirs[] = {SYSTEM_SHUTDOWN_PATH, NULL};
char *watchdog_device;
/* The log target defaults to console, but the original systemd process will pass its log target in through a
* command line argument, which will override this default. Also, ensure we'll never log to the journal or
@ -342,15 +342,17 @@ int main(int argc, char *argv[]) {
(void) cg_get_root_path(&cgroup);
in_container = detect_container() > 0;
/* If the logging messages are going to KMSG, and if we are not running from a container,
* then try to update the sysctl kernel.printk current value in order to see "info" messages;
* This current log level is not updated if already big enough.
/* If the logging messages are going to KMSG, and if we are not running from a container, then try to
* update the sysctl kernel.printk current value in order to see "info" messages; This current log
* level is not updated if already big enough.
*/
if (!in_container && IN_SET(log_get_target(), LOG_TARGET_AUTO,
LOG_TARGET_JOURNAL_OR_KMSG,
LOG_TARGET_SYSLOG_OR_KMSG,
LOG_TARGET_KMSG))
bump_sysctl_printk_log_level(LOG_INFO);
if (!in_container &&
IN_SET(log_get_target(),
LOG_TARGET_AUTO,
LOG_TARGET_JOURNAL_OR_KMSG,
LOG_TARGET_SYSLOG_OR_KMSG,
LOG_TARGET_KMSG))
bump_sysctl_printk_log_level(LOG_WARNING);
use_watchdog = getenv("WATCHDOG_USEC");
watchdog_device = getenv("WATCHDOG_DEVICE");