자주 실행하고 싶은 AC 프로그램 실행 파일이나 셸 스크립트가 있습니다. 무언가를 중지/일시 중지하거나 알리고 싶다면 프로세스에 신호를 보냅니다. 그래서 매번 프로세스를 확인해야 하고 이를 사용하여 신호를 보내야 pid
합니다 .kill
매번 pid를 확인하고 시스템이 종료될 때까지 기억해야 하는데, 정말 짜증납니다.pid
프로세스가 특정 플랫폼에서만 실행되기를 원합니다.init
항상 1로 달리는 것과 같습니다 .
관련 C API가 있나요? 또한 bash 프로그램 스크립트도 필요합니다.
답변1
PID를 유지하거나 할당할 수 없다고 생각합니다. 그러나 다음과 같은 스크립트에서 프로세스를 시작할 수 있습니다.
myprocess &
echo "$!" > /tmp/myprocess.pid
이것은 다른 사람들이 언급한 것처럼 "pid 파일"을 생성합니다. 그런 다음 예를 들어 $(</tmp/myprocess.pid)
또는 를 사용하여 bash에서 가져올 수 있습니다 $(cat /tmp/myprocess.pid)
.
이 작업을 수행할 때 주의하십시오. 프로세스가 종료되고 pid가 재활용되면 잘못된 신호를 보내게 됩니다. 당신은 확인할 수 있습니다:
pid=$(cat /tmp/myprocess.pid)
if [ "$(ps -o comm= -p "$pid")" = "myprocess" ]; then
...send your signal...
else echo "Myprocess is dead!"
fi
"$(ps -o comm= -p "$pid")"
이상하다고 생각되시면 댓글을 봐주세요. 누군가 콘텐츠에 대해 의심스러운 작업을 하고 있을 가능성이 있는 경우 /tmp/myprocess.pid
(다른 사용자가 해당 콘텐츠에 글을 쓰면 안 됩니다!) 더 강력한 유효성 검사를 수행할 수 있습니다.
답변2
pid를 수정하는 것은 확실히 문제를 해결하는 잘못된 방법이지만 일부 Linux 버전에서는 다음 값을 작성하여 원하는 pid를 얻을 수 있는 더 나은 기회를 가질 수 있습니다 /proc/sys/kernel/ns_last_pid
.
echo 9999 | sudo tee /proc/sys/kernel/ns_last_pid; ps -C ps
9999
PID TTY TIME CMD
10000 pts/3 00:00:00 ps
pid 10000이 아직 사용되지 않은 경우에만 유효합니다(그리고 ns_last_pid 작성과 프로세스/스레드 생성 사이에 pid 또는 스레드가 생성되지 않았습니다).
그렇지 않으면 원하는 PID를 얻을 때까지 항상 포크할 수 있습니다.
답변3
당신이 하고 싶은 것과 같은 일은 일반적으로 getpid(2)
알려진 이름을 가진 파일에 자신의 pid(얻을 수 있음)를 쓰는 프로세스의 수명 주기 초기에 수행됩니다. 범용 데몬에서는 이 파일의 이름을 일반적으로 구성할 수 있지만 특수 소프트웨어에서는 하드코딩할 수도 있습니다. (그래도 적어도 매크로를 사용하는 것이 좋습니다.)
PID 파일은 일반적으로 /var/run 또는 /run에 배치되지만 /tmp를 포함한 다른 위치에 배치될 수도 있습니다. 파일 시스템 계층 표준에 따르면 "올바른" 위치는 /run에 있지만 /var/run은 중요한 목적으로도 사용되며(많은 최신 시스템의 /run과 동일) /tmp에는 시작 시 루트 권한이 필요하지 않습니다( 시스템 데몬은 프로세스를 포기하기 전에 일반적으로 어떤 권한을 갖고 있는지 확인합니다.
이 파일은 관련 프로세스에 신호를 보내기 위해 관련 프로세스의 PID를 얻기 위해 다양한 방법으로 읽을 수 있습니다.
답변4
시스템 수준 데몬은 부팅 중 시작 순서에 따라 할당됩니다. 나는 고정된 pid를 시스템 로드 및 기타 종속성을 기반으로 커널에 의해 할당되기 때문에 특정 프로세스에 할당하는 것이 불가능하다고 생각합니다.
그러나 시스템 호출을 사용하면 고정된 PID를 프로세스에 할당할 수 있습니다. 그러나 그것을 달성하는 방법을 모릅니다.