사람들이 어떤 식으로든 구별할 수 있을까요?
- a) 부팅 중에 데몬이 시작됩니다.
- b) apt-get (re)start를 통해 설치 또는 업그레이드하시겠습니까?
이것이 데몬 자체와 구별될 수 있습니까?
여기서 사용 사례는 Type=oneshot
시작 시에만 실행되는 스크립트를 시스템에서 실행하도록 하는 것입니다. apt-get 설치 또는 업그레이드 중에는 그렇지 않습니다.
답변1
편집: 저는 영어를 모르고 여러분이 기본 초기화 프로세스를 확인하고 싶다고 생각했기 때문에 PID 1에 대해서만 이야기하고 있다는 점에 유의하세요. 원하는 단위로 변경하세요. 나는 systemd가 어떻게든 당신을 위해 PID를 뱉어낼 것이라고 확신합니다. 아니면 그렇지 않다면 ps ax |grep [commandname]
그렇습니다. 가동 시간과 프로세스 런타임 사이의 시간 차이를 조정해야 할 수도 있습니다. +3
bc 행에 또는 무언가를 추가하기만 하면 됩니다. /편집하다
나는 systemd를 사용하지 않으므로 소금 한 알씩 사용하십시오. 시스템 초기화와 관련이 없는 방법은 관심 있는 프로세스의 시작 시간과 시스템 가동 시간을 비교하는 것입니다. 전통적으로 PID 1은 init 프로세스용으로 예약되어 있지만 systemd가 이를 따르는지는 알 수 ps -o etimes [PID]
없습니다. ps 1
이것이 실제로 관심 있는 프로세스인지 확인 하고 그렇지 않은 경우 조정하십시오. 소수점 으로 구분 되는 cat /proc/uptime |cut -d "." -f 1
. 구분 기호도 제거됩니다.cut
ps
bc나 여러분이 가장 좋아하는 방법과 비교해 보세요. 명령줄 예는 다음과 같습니다.
echo $(cut -d "." -f 1 /proc/uptime)"-"$(ps -o etimes [PID] |tail -n 1 |tr -d ' \t')|bc
부팅 시 프로세스가 시작되면 예상되는 출력은 0입니다. 결과와 일치하는지 확인할 수 있습니다. 쉘 스크립트의 경우 if/then 테스트를 통해 실행하고 시작 시간으로 +-3초를 허용합니다. 적어도 잠시 동안. 그렇지 않고 가동 시간이 조금씩 다를 경우 때때로 0이 아닌 응답을 얻을 수 있으며 이로 인해 디버그하기 어려운 버그가 발생할 수 있습니다.
답변2
설계상 systemd는 시작 시 또는 업데이트 중에 동일한 환경에서 동일한 명령을 실행하여 서비스를 시작하고 다시 시작합니다. 따라서 서비스가 시작 시 실행 중인지 또는 업데이트 후 다시 시작되는지 알 수 있는 직접적인 방법은 없습니다. 관리자는 장치 시작 시간, 로그 등을 보고 이를 추론할 수 있습니다.
그러나 다음과 같이 서비스 단위에 특정 논리를 추가하면 이 문제를 해결할 수 있습니다.
[Unit]
...
ConditionPathExists=!/run/service-was-started-before
[Service]
...
ExecStartPre=touch /run/service-was-started-before
...
또는 systemd 타이머를 사용하여 시작 시에만 명령을 실행할 수 있습니다(참조:systemd.timer(5)) 여전히 좋습니다 cron
.