]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
main: log which process send SIGNAL to PID1
authorlicunlong <licunlong1@huawei.com>
Tue, 8 Mar 2022 11:18:36 +0000 (19:18 +0800)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 8 Mar 2022 15:09:46 +0000 (00:09 +0900)
This can help users to figure out what makes systemd freeze.
1. Someone kills systemd accidentally, then the sender_pid won't be 1;
2. systemd triggers segfault or assert, then the sender_pid will be 1;

src/core/main.c

index 5009b8d85fd6d4785ece110d9fef8e817ca63188..41a4b4225fea1caac1fd040baec0108031cc7df9 100644 (file)
@@ -228,7 +228,7 @@ _noreturn_ static void freeze_or_exit_or_reboot(void) {
         freeze();
 }
 
-_noreturn_ static void crash(int sig) {
+_noreturn_ static void crash(int sig, siginfo_t *siginfo, void *context) {
         struct sigaction sa;
         pid_t pid;
 
@@ -273,6 +273,14 @@ _noreturn_ static void crash(int sig) {
                         siginfo_t status;
                         int r;
 
+                        if (siginfo) {
+                                _cleanup_free_ char *cmdline = NULL;
+                                pid_t sender_pid = siginfo->si_pid;
+
+                                (void) get_process_cmdline(sender_pid, SIZE_MAX, 0, &cmdline);
+                                log_emergency("Caught <%s> from PID "PID_FMT" (%s)", signal_to_string(sig), sender_pid, strna(cmdline));
+                        }
+
                         /* Order things nicely. */
                         r = wait_for_terminate(pid, &status);
                         if (r < 0)
@@ -330,8 +338,8 @@ _noreturn_ static void crash(int sig) {
 
 static void install_crash_handler(void) {
         static const struct sigaction sa = {
-                .sa_handler = crash,
-                .sa_flags = SA_NODEFER, /* So that we can raise the signal again from the signal handler */
+                .sa_sigaction = crash,
+                .sa_flags = SA_NODEFER | SA_SIGINFO, /* So that we can raise the signal again from the signal handler */
         };
         int r;