8 votos

¿Qué indica un signo de interrogación `?` en la columna STAT de `ps` en MacOS?

Al ejecutar el comando

ps -xo pid,stat,user,time

En MacOS (Monterey; versión 12.5), a veces me aparece el mensaje ? en el STAT columna:

  PID STAT USER        TIME
[...] Removed for brevity
72633 S    mbercx   0:00.06
72949 ?s   mbercx   0:00.00
72952 ?    mbercx   0:00.00
74045 S    mbercx  56:17.38

¿Qué significa tener una ? en la columna STAT, es decir, ¿el estado del proceso?

8voto

yoliho Puntos 340

Significa Estado desconocido. (que básicamente no debería ocurrir)

Mirando el código fuente que nohillside señaló y en otros archivos https://github.com/apple-oss-distributions/adv_cmds/blob/7c10d3f757148b048a743f7d1d71be0153b2381f/ps/print.c#L441

El ? procede de esta línea en tasks.c junto con un comentario sobre su correspondencia con el estado numérico.

                            /*01234567 */
char    mach_state_table[] = " RUSITH?";

De otras búsquedas en Google https://github.com/osquery/osquery/issues/1886#issuecomment-191455988

Veo una lista de los ocho estados como

0 Zombie 1 Correr 2 Atascado 3 Durmiendo 4 Ralentí 5 Parado 6 Detenido 7 Desconocido

Los nombres aquí parecen coincidir con las letras del código ps.

Véase Respuesta de @pwncat para un listado más completo del código de Apple en ese caso desde arriba.

man ps no incluye los estados Parado y Desconocido. Tampoco el Código xnu para MacOS 13

Las versiones anteriores incluían un estado D de los manuales, pero el código de OSX 10.0 tiene las mismas constantes que el MacOS actual.

6voto

Liam Puntos 135

En MacOS, ps se basa aproximadamente en el libtop.c biblioteca cuyo fuente contiene la siguiente función (truncada por espacios en blanco):

/* Return a pointer to a string representation of a process state. */
const char * libtop_state_str(uint32_t state) {
    const char *strings[] = {
        "zombie",
#define LIBTOP_STATE_ZOMBIE 0
        "running",
#define LIBTOP_STATE_RUN    1
        "stuck",
#define LIBTOP_STATE_STUCK  2
        "sleeping",
#define LIBTOP_STATE_SLEEP  3
        "idle",
#define LIBTOP_STATE_IDLE   4
        "stopped",
#define LIBTOP_STATE_STOP   5
        "halted",
#define LIBTOP_STATE_HALT   6
        "unknown"
#define LIBTOP_STATE_UNKNOWN    7
    };
    assert(LIBTOP_NSTATES == sizeof(strings) / sizeof(char *));
    assert(state <= LIBTOP_STATE_MAX);
    assert(LIBTOP_STATE_MAXLEN >= 8); /* "sleeping" */
    return strings[state];
}

Como se ha señalado correctamente en otra respuesta, ps 's print.c toma los símbolos de estado del proceso de tasks.c donde coinciden directamente con los desplazamientos de estado encontrados en libtop.c como se muestra arriba.

La última es desconocida, lo que significa que el estado del proceso no entra en ninguna categoría concreta. Y el último símbolo es un signo de interrogación, por lo que en raras ocasiones puede que lo veas en la etiqueta STAT columna.

3voto

user18044 Puntos 1567

Significa que el ps no coincide con el sistema operativo.

La inclusión de un signo de interrogación en el state columna de la BSD ps es el resultado de pulsar a default: caso en el código donde el estado actual del proceso tal y como lo informa el sistema operativo no es uno de los estados que el código de ps realmente lo entiende.

MacOS no utiliza directamente un núcleo BSD. Algunos comandos han sido modificados para trabajar con las diferencias del kernel. Claramente, una modificación se perdió aquí.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X