Print this page
11690 ::ps -s could show service FMRIs
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Jason King <jason.king@joyent.com>

*** 59,68 **** --- 59,69 ---- #include <sys/cred_impl.h> #include <sys/zone.h> #include <sys/panic.h> #include <regex.h> #include <sys/port_impl.h> + #include <sys/contract/process_impl.h> #include "avl.h" #include "bio.h" #include "bitset.h" #include "combined.h"
*** 142,151 **** --- 143,153 ---- #define PS_PRTLWPS 0x2 #define PS_PSARGS 0x4 #define PS_TASKS 0x8 #define PS_PROJECTS 0x10 #define PS_ZONES 0x20 + #define PS_SERVICES 0x40 static int ps_threadprint(uintptr_t addr, const void *data, void *private) { const kthread_t *t = (const kthread_t *)data;
*** 271,288 **** --- 273,297 ---- struct pid *p_pgidp; struct cred *p_cred; struct sess *p_sessp; struct task *p_task; struct zone *p_zone; + struct cont_process *p_ct_process; pid_t p_ppid; uint_t p_flag; struct { char u_comm[MAXCOMLEN + 1]; char u_psargs[PSARGSZ]; } p_user; } mdb_ps_proc_t; + /* + * A reasonable enough limit. Note that we purposefully let this column over-run + * if needed. + */ + #define FMRI_LEN (128) + int ps(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) { uint_t prt_flags = 0; mdb_ps_proc_t pr;
*** 290,299 **** --- 299,310 ---- sess_t session; cred_t cred; task_t tk; kproject_t pj; zone_t zn; + struct cont_process cp; + char fmri[FMRI_LEN] = ""; if (!(flags & DCMD_ADDRSPEC)) { if (mdb_walk_dcmd("proc", "ps", argc, argv) == -1) { mdb_warn("can't walk 'proc'"); return (DCMD_ERR);
*** 302,327 **** } if (mdb_getopts(argc, argv, 'f', MDB_OPT_SETBITS, PS_PSARGS, &prt_flags, 'l', MDB_OPT_SETBITS, PS_PRTLWPS, &prt_flags, 'T', MDB_OPT_SETBITS, PS_TASKS, &prt_flags, 'P', MDB_OPT_SETBITS, PS_PROJECTS, &prt_flags, 'z', MDB_OPT_SETBITS, PS_ZONES, &prt_flags, 't', MDB_OPT_SETBITS, PS_PRTTHREADS, &prt_flags, NULL) != argc) return (DCMD_USAGE); if (DCMD_HDRSPEC(flags)) { ! mdb_printf("%<u>%1s %6s %6s %6s %6s ", "S", "PID", "PPID", "PGID", "SID"); if (prt_flags & PS_TASKS) ! mdb_printf("%5s ", "TASK"); if (prt_flags & PS_PROJECTS) ! mdb_printf("%5s ", "PROJ"); if (prt_flags & PS_ZONES) ! mdb_printf("%5s ", "ZONE"); ! mdb_printf("%6s %10s %?s %s%</u>\n", "UID", "FLAGS", "ADDR", "NAME"); } if (mdb_ctf_vread(&pr, "proc_t", "mdb_ps_proc_t", addr, 0) == -1) return (DCMD_ERR); --- 313,341 ---- } if (mdb_getopts(argc, argv, 'f', MDB_OPT_SETBITS, PS_PSARGS, &prt_flags, 'l', MDB_OPT_SETBITS, PS_PRTLWPS, &prt_flags, + 's', MDB_OPT_SETBITS, PS_SERVICES, &prt_flags, 'T', MDB_OPT_SETBITS, PS_TASKS, &prt_flags, 'P', MDB_OPT_SETBITS, PS_PROJECTS, &prt_flags, 'z', MDB_OPT_SETBITS, PS_ZONES, &prt_flags, 't', MDB_OPT_SETBITS, PS_PRTTHREADS, &prt_flags, NULL) != argc) return (DCMD_USAGE); if (DCMD_HDRSPEC(flags)) { ! mdb_printf("%<u>%-1s %-6s %-6s %-6s %-6s ", "S", "PID", "PPID", "PGID", "SID"); if (prt_flags & PS_TASKS) ! mdb_printf("%-5s ", "TASK"); if (prt_flags & PS_PROJECTS) ! mdb_printf("%-5s ", "PROJ"); if (prt_flags & PS_ZONES) ! mdb_printf("%-5s ", "ZONE"); ! if (prt_flags & PS_SERVICES) ! mdb_printf("%-40s ", "SERVICE"); ! mdb_printf("%-6s %-10s %-?s %-s%</u>\n", "UID", "FLAGS", "ADDR", "NAME"); } if (mdb_ctf_vread(&pr, "proc_t", "mdb_ps_proc_t", addr, 0) == -1) return (DCMD_ERR);
*** 335,355 **** mdb_vread(&tk, sizeof (tk), (uintptr_t)pr.p_task); if (prt_flags & PS_PROJECTS) mdb_vread(&pj, sizeof (pj), (uintptr_t)tk.tk_proj); if (prt_flags & PS_ZONES) mdb_vread(&zn, sizeof (zn), (uintptr_t)pr.p_zone); ! mdb_printf("%c %6d %6d %6d %6d ", pstat2ch(pr.p_stat), pid.pid_id, pr.p_ppid, pgid.pid_id, sid.pid_id); if (prt_flags & PS_TASKS) ! mdb_printf("%5d ", tk.tk_tkid); if (prt_flags & PS_PROJECTS) ! mdb_printf("%5d ", pj.kpj_id); if (prt_flags & PS_ZONES) ! mdb_printf("%5d ", zn.zone_id); ! mdb_printf("%6d 0x%08x %0?p %s\n", cred.cr_uid, pr.p_flag, addr, (prt_flags & PS_PSARGS) ? pr.p_user.u_psargs : pr.p_user.u_comm); if (prt_flags & ~PS_PSARGS) (void) mdb_pwalk("thread", ps_threadprint, &prt_flags, addr); --- 349,391 ---- mdb_vread(&tk, sizeof (tk), (uintptr_t)pr.p_task); if (prt_flags & PS_PROJECTS) mdb_vread(&pj, sizeof (pj), (uintptr_t)tk.tk_proj); if (prt_flags & PS_ZONES) mdb_vread(&zn, sizeof (zn), (uintptr_t)pr.p_zone); + if ((prt_flags & PS_SERVICES) && pr.p_ct_process != NULL) { + mdb_vread(&cp, sizeof (cp), (uintptr_t)pr.p_ct_process); ! if (mdb_read_refstr((uintptr_t)cp.conp_svc_fmri, fmri, ! sizeof (fmri)) <= 0) ! (void) strlcpy(fmri, "?", sizeof (fmri)); ! ! /* Strip any standard prefix and suffix. */ ! if (strncmp(fmri, "svc:/", sizeof ("svc:/") - 1) == 0) { ! char *i = fmri; ! char *j = fmri + sizeof ("svc:/") - 1; ! for (; *j != '\0'; i++, j++) { ! if (strcmp(j, ":default") == 0) ! break; ! *i = *j; ! } ! ! *i = '\0'; ! } ! } ! ! mdb_printf("%-c %-6d %-6d %-6d %-6d ", pstat2ch(pr.p_stat), pid.pid_id, pr.p_ppid, pgid.pid_id, sid.pid_id); if (prt_flags & PS_TASKS) ! mdb_printf("%-5d ", tk.tk_tkid); if (prt_flags & PS_PROJECTS) ! mdb_printf("%-5d ", pj.kpj_id); if (prt_flags & PS_ZONES) ! mdb_printf("%-5d ", zn.zone_id); ! if (prt_flags & PS_SERVICES) ! mdb_printf("%-40s ", fmri); ! mdb_printf("%-6d 0x%08x %0?p %-s\n", cred.cr_uid, pr.p_flag, addr, (prt_flags & PS_PSARGS) ? pr.p_user.u_psargs : pr.p_user.u_comm); if (prt_flags & ~PS_PSARGS) (void) mdb_pwalk("thread", ps_threadprint, &prt_flags, addr);
*** 364,373 **** --- 400,410 ---- "Options:\n" " -f\tDisplay command arguments\n" " -l\tDisplay LWPs\n" " -T\tDisplay tasks\n" " -P\tDisplay projects\n" + " -s\tDisplay SMF FMRI\n" " -z\tDisplay zones\n" " -t\tDisplay threads\n\n"); mdb_printf("The resulting output is a table of the processes on the " "system. The\n"
*** 387,396 **** --- 424,434 ---- mdb_printf("PGID\tProcess group id.\n"); mdb_printf("SID\tProcess id of the session leader.\n"); mdb_printf("TASK\tThe task id of the process.\n"); mdb_printf("PROJ\tThe project id of the process.\n"); mdb_printf("ZONE\tThe zone id of the process.\n"); + mdb_printf("SERVICE The SMF service FMRI of the process.\n"); mdb_printf("UID\tThe user id of the process.\n"); mdb_printf("FLAGS\tThe process flags (see ::pflags).\n"); mdb_printf("ADDR\tThe kernel address of the proc_t structure of the " "process\n"); mdb_printf("NAME\tThe name (p_user.u_comm field) of the process. If "