首页 > 解决方案 > Systemd 状态显示守护进程处于活动状态(正在运行),但守护进程未执行并创建重复进程

问题描述

下面是守护程序的代码(在 C 中)。

    int main(void) {
    
    /* Our process ID and Session ID */
    pid_t pid2;
    
    /* The Big Loop */
    while (1) {
        time_t now;
        time(&now);
        struct tm *local = localtime(&now);
        int hour = local->tm_hour;
        int min = local->tm_min;
        int earliest_time = 0; //8AM earliest a workout will be developed
        int latest_time = 24; //5PM latest a workout will be developed
        int min_interval = 20; //minimum interval of a workout
        int max_interval = 30; //maximum interval of a workout

        //If it's in between these hours of the day...
        if (hour >= earliest_time && hour < latest_time){

            int rand_interval = (rand() % (max_interval + 1 - min_interval)) + min_interval;

            pid2 = fork();
            if (pid2 == 0){
                execlp("./workout_SMS.py","./workout_SMS.py",NULL);
            }
            
            waitpid(pid2,0,0);
            //kill(pid2,SIGTERM);
            sleep(rand_interval);
        }

        else{
        sleep(60); /* wait 30 seconds */
        }
    }
exit(EXIT_SUCCESS);

}

我希望这个守护进程在启动时使用 Systemd 启动。根据 Systemd 手册和其他在线资源,我配置了一个 daemon.service 文件,如下所示。

[Unit]
Description=workout-daemon startup service
[Service]
User=pi
Type=simple
ExecStart=/home/pi/python/twilio/workout_SMS/workout-daemon
Restart=on-failure

[Install]
WantedBy=multi-user.target

下面是守护进程的 Systemd 状态。如图所示,状态表明它是“活动(运行)”,并且随着时间的推移,它会继续创建新的重复进程。期望的行为是它只运行一个进程而不创建重复项。

● workout.service - workout-daemon startup service file for text message workouts
   Loaded: loaded (/etc/systemd/system/workout.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-12-29 03:15:35 PST; 1min 41s ago
 Main PID: 22363 (workout-daemon)
    Tasks: 5 (limit: 881)
   CGroup: /system.slice/workout.service
           ├─22363 /home/pi/python/twilio/workout_SMS/workout-daemon
           ├─22364 /home/pi/python/twilio/workout_SMS/workout-daemon
           ├─22409 /home/pi/python/twilio/workout_SMS/workout-daemon
           ├─22493 /home/pi/python/twilio/workout_SMS/workout-daemon
           └─22525 /home/pi/python/twilio/workout_SMS/workout-daemon

预期的操作是python脚本以特定的时间间隔向我的手机发送一条短信。当直接从工作目录运行时,守护程序将按预期运行,但是当我使用“sudo systemctl daemon-reload”->“sudo systemctl enable exercise.service”->“sudo systemctl start exercise.服务”。

我的 Systemd 配置中有什么遗漏吗?

标签: craspberry-piforkraspbiansystemd

解决方案


推荐阅读