mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +03:00
systemctl: highlight failed processes in systemctl status
This commit is contained in:
parent
0129173ab0
commit
9a57c62944
@ -820,7 +820,8 @@ systemd_vconsole_setup_LDADD = \
|
||||
|
||||
systemd_remount_api_vfs_SOURCES = \
|
||||
src/remount-api-vfs.c \
|
||||
src/mount-setup.c
|
||||
src/mount-setup.c \
|
||||
src/exit-status.c
|
||||
|
||||
systemd_remount_api_vfs_CFLAGS = \
|
||||
$(AM_CFLAGS)
|
||||
|
@ -20,6 +20,7 @@
|
||||
***/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include "exit-status.h"
|
||||
|
||||
@ -143,3 +144,31 @@ const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level) {
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
bool is_clean_exit(int code, int status) {
|
||||
|
||||
if (code == CLD_EXITED)
|
||||
return status == 0;
|
||||
|
||||
/* If a daemon does not implement handlers for some of the
|
||||
* signals that's not considered an unclean shutdown */
|
||||
if (code == CLD_KILLED)
|
||||
return
|
||||
status == SIGHUP ||
|
||||
status == SIGINT ||
|
||||
status == SIGTERM ||
|
||||
status == SIGPIPE;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool is_clean_exit_lsb(int code, int status) {
|
||||
|
||||
if (is_clean_exit(code, status))
|
||||
return true;
|
||||
|
||||
return
|
||||
code == CLD_EXITED &&
|
||||
(status == EXIT_NOTINSTALLED || status == EXIT_NOTCONFIGURED);
|
||||
}
|
||||
|
@ -22,6 +22,8 @@
|
||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
***/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef enum ExitStatus {
|
||||
/* EXIT_SUCCESS defined by libc */
|
||||
/* EXIT_FAILURE defined by libc */
|
||||
@ -75,4 +77,7 @@ typedef enum ExitStatusLevel {
|
||||
|
||||
const char* exit_status_to_string(ExitStatus status, ExitStatusLevel level);
|
||||
|
||||
bool is_clean_exit(int code, int status);
|
||||
bool is_clean_exit_lsb(int code, int status);
|
||||
|
||||
#endif
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "dbus-mount.h"
|
||||
#include "special.h"
|
||||
#include "bus-errors.h"
|
||||
#include "exit-status.h"
|
||||
|
||||
static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = {
|
||||
[MOUNT_DEAD] = UNIT_INACTIVE,
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "util.h"
|
||||
#include "set.h"
|
||||
#include "mount-setup.h"
|
||||
#include "exit-status.h"
|
||||
|
||||
/* Goes through /etc/fstab and remounts all API file systems, applying
|
||||
* options that are in /etc/fstab that systemd might not have
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "dbus-service.h"
|
||||
#include "special.h"
|
||||
#include "bus-errors.h"
|
||||
#include "exit-status.h"
|
||||
|
||||
#define COMMENTS "#;\n"
|
||||
#define NEWLINES "\n\r"
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "special.h"
|
||||
#include "bus-errors.h"
|
||||
#include "label.h"
|
||||
#include "exit-status.h"
|
||||
|
||||
static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
|
||||
[SOCKET_DEAD] = UNIT_INACTIVE,
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "dbus-swap.h"
|
||||
#include "special.h"
|
||||
#include "bus-errors.h"
|
||||
#include "exit-status.h"
|
||||
|
||||
static const UnitActiveState state_translation_table[_SWAP_STATE_MAX] = {
|
||||
[SWAP_DEAD] = UNIT_INACTIVE,
|
||||
|
@ -1847,15 +1847,31 @@ static void print_status_info(UnitStatusInfo *i) {
|
||||
|
||||
LIST_FOREACH(exec, p, i->exec) {
|
||||
char *t;
|
||||
bool good;
|
||||
|
||||
/* Only show exited processes here */
|
||||
if (p->code == 0)
|
||||
continue;
|
||||
|
||||
t = strv_join(p->argv, " ");
|
||||
printf("\t Process: %u %s=%s (code=%s, ", p->pid, p->name, strna(t), sigchld_code_to_string(p->code));
|
||||
printf("\t Process: %u %s=%s ", p->pid, p->name, strna(t));
|
||||
free(t);
|
||||
|
||||
#ifdef HAVE_SYSV_COMPAT
|
||||
if (i->is_sysv)
|
||||
good = is_clean_exit_lsb(p->code, p->status);
|
||||
else
|
||||
#endif
|
||||
good = is_clean_exit(p->code, p->status);
|
||||
|
||||
if (!good) {
|
||||
on = ansi_highlight(true);
|
||||
off = ansi_highlight(false);
|
||||
} else
|
||||
on = off = "";
|
||||
|
||||
printf("%s(code=%s, ", on, sigchld_code_to_string(p->code));
|
||||
|
||||
if (p->code == CLD_EXITED) {
|
||||
const char *c;
|
||||
|
||||
@ -1870,7 +1886,10 @@ static void print_status_info(UnitStatusInfo *i) {
|
||||
|
||||
} else
|
||||
printf("signal=%s", signal_to_string(p->status));
|
||||
printf(")\n");
|
||||
|
||||
printf(")%s\n", off);
|
||||
|
||||
on = off = NULL;
|
||||
|
||||
if (i->main_pid == p->pid &&
|
||||
i->start_timestamp == p->start_timestamp &&
|
||||
|
27
src/util.c
27
src/util.c
@ -2617,33 +2617,6 @@ int make_null_stdio(void) {
|
||||
return make_stdio(null_fd);
|
||||
}
|
||||
|
||||
bool is_clean_exit(int code, int status) {
|
||||
|
||||
if (code == CLD_EXITED)
|
||||
return status == 0;
|
||||
|
||||
/* If a daemon does not implement handlers for some of the
|
||||
* signals that's not considered an unclean shutdown */
|
||||
if (code == CLD_KILLED)
|
||||
return
|
||||
status == SIGHUP ||
|
||||
status == SIGINT ||
|
||||
status == SIGTERM ||
|
||||
status == SIGPIPE;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool is_clean_exit_lsb(int code, int status) {
|
||||
|
||||
if (is_clean_exit(code, status))
|
||||
return true;
|
||||
|
||||
return
|
||||
code == CLD_EXITED &&
|
||||
(status == EXIT_NOTINSTALLED || status == EXIT_NOTCONFIGURED);
|
||||
}
|
||||
|
||||
bool is_device_path(const char *path) {
|
||||
|
||||
/* Returns true on paths that refer to a device, either in
|
||||
|
@ -267,9 +267,6 @@ char *format_timespan(char *buf, size_t l, usec_t t);
|
||||
int make_stdio(int fd);
|
||||
int make_null_stdio(void);
|
||||
|
||||
bool is_clean_exit(int code, int status);
|
||||
bool is_clean_exit_lsb(int code, int status);
|
||||
|
||||
unsigned long long random_ull(void);
|
||||
|
||||
#define DEFINE_STRING_TABLE_LOOKUP(name,type) \
|
||||
|
Loading…
Reference in New Issue
Block a user