그러지 마세요.

그러지 마세요.

현재 systemd 데몬을 개발 중입니다. 내가 직면한 문제는 포크가 감지되지 않기 때문에 시작 후 1분 30초 후에 데몬이 종료된다는 것입니다.

저는 이 int daemon(int nochdir, int noclose)함수를 사용하여 프로세스를 데몬화합니다.

int main()
{
    openlog("shutdownd", LOG_PID, LOG_DAEMON);

    if(daemon(0, 0) != 0)
    {
        syslog(LOG_ERR, "Error daemonizing process : %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    syslog(LOG_NOTICE, "Daemon started !\n");

    pthread_create(&threads[0], NULL, &alimThread, NULL);
    pthread_create(&threads[1], NULL, &extinctThread, NULL);
    pthread_create(&threads[2], NULL, &blinkThread, NULL);

    while(1)
    {
    }

    syslog(LOG_NOTICE, "Daemon stopped !\n");
    exit(EXIT_SUCCESS);
}

서비스 파일입니다/etc/systemd/system/shutdownd.service

[Unit]
Description=Shutdown Daemon
After=syslog.target

[Service]
Type=forking
PIDFile=/var/run/shutdownd.pid
ExecStartPre=/bin/rm -f /var/run/shutdownd.pid
ExecStartPre=/usr/bin/shutdownd-exportGpio.sh
ExecStart=/usr/bin/shutdownd
Restart=on-abort

[Install]
WantedBy=multi-user.target

데몬 기능은 프로세스를 분기하고 터미널에서 분리해야 하며, 파일 설명자를 닫고 작업 디렉터리를 /로 변경합니다.

그러나 systemd는 1분 30초 후에 실행 중인 데몬을 종료하므로 포크를 감지하지 못하는 것 같습니다.

Sep  8 13:52:50 raspberrypi systemd[1]: shutdownd.service: PID file /var/run/shutdownd.pid not readable (yet?) after start: No such file or directory
Sep  8 13:52:50 raspberrypi shutdownd[293]: Daemon started !
Sep  8 13:52:50 raspberrypi shutdownd[293]: [Extinct] Value changed to 0
Sep  8 13:52:50 raspberrypi shutdownd[293]: OFF
Sep  8 13:52:50 raspberrypi shutdownd[293]: [Alim] Value changed to 0
Sep  8 13:52:50 raspberrypi shutdownd[293]: OFF
Sep  8 13:53:46 raspberrypi shutdownd[293]: [Alim] Value changed to 1
Sep  8 13:53:46 raspberrypi shutdownd[293]: Toogle : ON
Sep  8 13:53:48 raspberrypi shutdownd[293]: Toogle : OFF
[...]
Sep  8 13:54:16 raspberrypi shutdownd[293]: [Extinct] Value changed to 1
Sep  8 13:54:16 raspberrypi shutdownd[293]: ON
Sep  8 13:54:20 raspberrypi systemd[1]: shutdownd.service: Start operation timed out. Terminating.
Sep  8 13:54:20 raspberrypi systemd[1]: shutdownd.service: Unit entered failed state.
Sep  8 13:54:20 raspberrypi systemd[1]: shutdownd.service: Failed with result 'timeout'.

systemd가 포크를 감지하지 못하는 이유를 아는 사람이 있습니까?

fork()내 코드를 명시적으로 호출해야 합니까?
이 경우 데몬화 함수를 직접 작성해야 하는데, 이는 어렵지는 않지만 이 목적을 위해 ac 함수가 이미 존재하기 때문에 완전히 쓸모없고 중복됩니다.

답변1

그러지 마세요.

절대적으로하지. 어느 쪽이든, 라이브러리 기능을 통하든, 자신만의 코드를 롤링하든 상관없습니다. 모든 서비스 관리 시스템에 적합합니다. 이는 1990년대부터 잘못된 인식이었습니다.

당신의 데몬은이미서비스 컨텍스트에서 실행되며 서비스 관리자가 이 방식으로 호출합니다. 귀하의 프로그램은아무것도 하지 않았다이와 관련하여. 이런 식으로 프로그램 작성을 완전히 중단하십시오.

forking그리고 준비 프로토콜을 사용하지 마십시오 . 귀하의 프로그램은 다중 스레드이며 forking준비된 프로토콜을 추가하려고 하면 거의 확실히 제대로 실행되지 않을 것입니다. 프로토콜을 올바르게 얻는다는 것은 포크를 의미하기 때문입니다.뒤쪽에모든 스레드 시작을 포함하여 모든 초기화가 완료되었습니다. 거의 없음실제로forking현장에서 사용하기 위한 준비 프로토콜. 다른 프로토콜을 사용하십시오.

추가 읽기

관련 정보