ps 및 pgrep을 사용하여 /sbin/init의 프로세스 ID를 확인하십시오.

ps 및 pgrep을 사용하여 /sbin/init의 프로세스 ID를 확인하십시오.

다음 명령은 결과를 반환하지 않습니다.

ps -C init -o pid=
ps -C /sbin/init -o pid=
pgrep -x /sbin/init

다음 명령은 다음 출력을 제공합니다.

$ ps -ealf | grep init
4 S root         1     0  0  80   0 -  6266 -      08:35 ?        00:00:03 /sbin/init auto noprompt

$ pidof init
1

init 프로세스를 사용하여 PID를 얻는 방법을 알고 싶습니다.폴리스티렌-C그리고패키지방법. 내가 여기서 뭘 잘못하고 있는 걸까?

커널 4.10.0-27-generic 32비트와 함께 Ubuntu 16.04.3 LTS를 사용하고 있습니다.

답변1

Ubuntu 16.04에서 /sbin/init다음은 systemd에 대한 심볼릭 링크입니다.

$ readlink /sbin/init
/lib/systemd/systemd
$ sudo readlink /proc/1/exe
/lib/systemd/systemd
$ sudo xargs -0a /proc/1/cmdline
/sbin/init splash

ps -C읽고 있는 명령의 이름입니다 /proc/<pid>/stat. 바라보다man 5 proc:

/proc/[pid]/stat
      Status information about the process.  This is used by ps(1).
      It is defined in the kernel source file fs/proc/array.c.
      ...

      (2) comm  %s
                The filename of the executable, in parentheses.
                This is visible whether or not the executable is
                swapped out.

systemd는 init(예: )로 자체 재실행을 지원하므로 systemctl daemon-reexecinit로 시작되면 가능한 한 빨리 변경하려고 시도합니다. ~에서systemd/sbin/init원천:

/* If we get started via the /sbin/init symlink then we are called 'init'. After a subsequent reexecution we
 * are then called 'systemd'. That is confusing, hence let's call us systemd right-away. */
program_invocation_short_name = systemd;
(void) prctl(PR_SET_NAME, systemd);

따라서 ps -C initPID 1을 사용한 systemd는 일치하지 않습니다. 여기 pgrep-f.

$ ps -C systemd
  PID TTY          TIME CMD
    1 ?        00:00:01 systemd
 1261 ?        00:00:00 systemd

$ pgrep -f /sbin/init
1

pgrep -f확인 /proc/<pid>/cmdline하고 systemd는 이를 변경하려고 시도하지 않습니다. 출력 systemd의 두 번째 항목 ps은 사용자 세션 초기화입니다.

답변2

sysvcompat 없이 systemd를 사용하는 모든 시스템은 다음과 같습니다. /sbin/init는 systemd에 대한 링크이지만 명령 이름은 여전히 ​​systemd입니다. ps의 -C 옵션을 사용하면 systemd만 찾습니다. ps의 -f 옵션을 사용하면 전체 형식이 CMD 열에 명령 이름(comm) 대신 명령 인수(args)를 인쇄하고 systemd가 실제로 해당 파일을 사용하기 시작한다는 의미입니다./sbin/init

다음 명령을 시도해 보세요.

ps --pid=1 -o cmd,comm

실제로 여기에는 다른 매개변수(있는 경우)도 포함되며 이는 Unix의 매개변수가 심볼릭 링크로 인해 완전히 다른 명령 이름을 가리킬 수 있음을 의미합니다.

관련 정보