나중에 동일한 PID를 사용하여 생성된 프로세스가 아니라 동일한 프로세스가 종료되도록 하려면 어떤 정보가 필요합니까?

나중에 동일한 PID를 사용하여 생성된 프로세스가 아니라 동일한 프로세스가 종료되도록 하려면 어떤 정보가 필요합니까?

start.sh스크립트로 시작하여 PID를 저장하는 여러 명령이 있습니다 . 그런 다음 stop.sh사용자에게 편리한 시간에 실행하여 차단 하고 싶습니다 .

함정에 유의하세요.

  1. 오늘 실행했는데 start.shPID가 파일에 저장되었습니다.150001500115002
  2. 프로세스를 중지하는 것을 잊었습니다. 일주일 후 컴퓨터를 다시 시작했습니다.
  3. 이제 스크립트를 실행합니다. PID가 있는 작업을 종료하려고 시도하고 stop.sh무의식적으로 파일에서 해당 작업을 읽습니다. => 새로 재부팅한 시스템에 이러한 PID가 있는 경우 이러한 작업은 더 이상 스크립트를 통해 시작하는 작업이 아니며 시스템을 알 수 없는 상태로 두게 됩니다.150001500115002
    start.sh

Linux 스크립트에서 프로세스의 PID를 처음 캡처할 때 $$나중에 동일한 PID를 사용하여 발생할 수 있는 다른 작업과 혼동되지 않도록 추가 정보를 수집하려면 어떻게 해야 합니까?

예를 들어 PPID를 수집하거나 시작 날짜/시간을 수집하거나 일종의 "보편적 고유성"을 보장하는 등의 내용을 작성할 수 있다면..?

프로세스 정보를 수집하는 방법과 혼란 없이 프로세스 정보를 종료하는 방법은 무엇입니까?

답변1

프로세스 정보를 수집하는 방법과 혼란 없이 프로세스 정보를 종료하는 방법은 무엇입니까?

넌 몰라.

대신 나중에 다시 찾기 위해 안정적으로 참조할 수 있는 컨텍스트 내에서 프로세스가 실행되는지 확인합니다.

이것옳은이 문제를 해결하는 방법은 대상 플랫폼의 서비스 관리 시스템(현재 일반적으로 Linux 시스템에서 시스템화됨)을 사용하는 것입니다. 그들은 대부분의 경우 일을 올바르게 처리하며 특히디자인됨이런 일을 하세요.

선호도가 높은 순서대로 대안은 다음과 같습니다.

  • 사용하다그룹구체적인 이름을 가지세요. 이 접근 방식은 Linux에만 적용되지만 안정적이고 원자적으로 종료하는 기능과 같은 많은 명백한 이점이 있습니다.모두시작한 프로세스의 하위 프로세스입니다. PID가 cgroup과 연결되는 것이 아니라 특정 프로세스가 cgroup과 명시적으로 연결되기 때문에 이는 본질적으로 수명주기 문제를 해결합니다.
  • 감독 시스템을 사용합니다.달리다,s6, 또는데몬 도구. 이러한 솔루션은 모니터링하려는 프로세스의 상위 프로세스로 쉽고 안정적으로 찾을 수 있는 프로세스를 활용하여 문제를 해결합니다.
  • PID 파일을 /run있어야 할 곳에 넣으십시오. 시스템 재부팅 시 PID 재사용과 관련하여 지적하신 문제는 알려진 문제로 안정적으로 해결되었습니다.수십 년시스템이 재부팅될 때마다 지워지는 디렉토리에 PID 파일을 넣기만 하면 됩니다. /runLinux 시스템의 표준 위치입니다. 이는 여전히 PID 재사용 문제를 나타냅니다. PID는 관련 프로세스의 수명 동안에만 고유하므로 예기치 않게 종료되고 PID 파일을 남겨 두는 프로세스 중 하나에 여전히 재사용 문제가 발생할 수 있습니다.

답변2

대규모 네트워크에서 다양한 진단 스크립트를 실행해야 할 때 모든 스크립트에서 --tag=....옵션을 수락(및 무시)하도록 합니다. (분명히 표준 명령을 사용하여 이 작업을 수행할 수는 없지만 상위 셸에서 이를 래핑할 수 있습니다.)

일반적인 --tag에는 이를 시작한 호스트 이름, nonce 및 시작 시간(나노초까지)이 (적어도) 포함됩니다. 원격 작업의 경우 원격 시스템의 PID를 알지 못할 수도 있습니다.

ps명령은 특정 프로세스에 대해 grep할 수 있도록 매개변수를 표시할 수 있습니다. 잠재적인 프로세스에 대한 보고서를 주기적으로 생성하고 목록에서 종료된 프로세스를 지우는 cron 작업을 가질 수도 있습니다.

답변3

PID 정보를 tmpfs 파일 시스템에 저장하면 재부팅 후 파일이 존재하지 않습니다.

/run일반적으로 tmpfs이거나 /tmp일부 배포판에서는 tmpfs입니다.

또는 직접 설치

# mount tmpfs /path/to/your/mountpoint -t tmpfs 

답변4

/proc/15000start.sh를 다른 디렉터리에 바인딩하여 설치합니다 . (경합 조건을 피하기 위해 종료하기 전에 상위 프로세스에 의해 수행되는 것이 바람직합니다 wait.) stop.sh에서 바인드 마운트된 디렉토리를 열어 보십시오. 번들 마운트가 사라지면 시스템이 재부팅됩니다. ESRCH(No such process)로 디렉터리 열기에 실패하면 프로세스가 종료됩니다. (이는 동일한 PID를 가진 새 프로세스가 나중에 실행되기 시작하는 경우에도 발생합니다.) 디렉토리 열기에 성공하고 바인드 마운트가 여전히 존재하는 경우 해당 프로세스는 여전히 프로세스이므로 안전하게 종료할 수 있습니다. (다른 경쟁 조건을 피하려면 해당 조건을 종료하는 것이 가장 좋습니다 pidfd_send_signal.)

관련 정보