다음 명령은 결과를 반환하지 않습니다.
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-reexec
init로 시작되면 가능한 한 빨리 변경하려고 시도합니다. ~에서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 init
PID 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의 매개변수가 심볼릭 링크로 인해 완전히 다른 명령 이름을 가리킬 수 있음을 의미합니다.