Почему задание cron порождает дочерний процесс каждые несколько секунд

У меня есть задание cron, которое порождает дочерний процесс с тем же именем, что и у родительского процесса, каждые несколько секунд. Все использование ЦП происходит в дочернем процессе в течение нескольких секунд, а затем умирает. Кажется действительно странным. Вот вывод htop:

CPU% MEM%  Command
0         0            /bin/sh -c /etc/script.sh > /var/log/script.log
0         0                |— /bin/bash /etc/script.sh
100     0.4                   |— /bin/bash /etc/script.sh

Последний процесс продолжает возрождаться каждые несколько секунд. Почему он не работает в рамках одного процесса? Должны ли команды дочернего процесса быть больше похожи на фактические команды, которые я запускаю из сценария, например: | - find .. / или / | - grep или | - tar?

Cron:

*/30 *   *   *   *   root  /etc/script.sh > /var/log/script.log

Script:

    #!/bin/bash

    LOG_DIR={{ log_dir | default('/var/logs') }}
    ARCHIVE_DIR={{ archive_dir | default('/var/archive') }}
    PIDFILE={{ pidfile | default('/run/script.pid') }}

    ## Handle cases where cronjobs take too long to prevent starting new ones
    if [ -f $PIDFILE ]
    then
        PID=$(cat $PIDFILE)
        ps -p $PID > /dev/null 2>&1
        if [ $? -eq 0 ]
        then
            echo "Process already running"
            exit 1
        else
            ## Process not found assume not running
            echo $$ > $PIDFILE
            if [ $? -ne 0 ]
            then
                echo "Could not create PID file"
                exit 1
            fi
        fi
    else
        echo $$ > $PIDFILE
        if [ $? -ne 0 ]
        then
            echo "Could not create PID file"
            exit 1
        fi
    fi


    new_files_archived=0
    for folder in $(ls ${LOG_DIR});
        do
            ## Archive the last 30 days worth of logs
            log_files=$(find -H ${LOG_DIR}/${folder} -not -empty -type f -regex '.*.log' -mtime -5)
            archived_logs_files=$(find ${ARCHIVE_DIR/$folder} -type f)
            if [ $? -eq 0 ]; then
                mkdir -p "$ARCHIVE_DIR/$folder"
            fi
            for log_file in $log_files;
                do
                    grep -q $(basename ${log_file} .log) <<<$archived_logs_files
                    if [ $? -eq 0 ]; then
                        :
                        #echo $log_file Found, already archived, skipping..
                    else
                        echo ${log_file}.gz Not Found, creating archive
                        gzip -c $log_file > "$ARCHIVE_DIR/$folder/$(basename ${log_file}).gz"
                        touch -d "$(date -R -r ${log_file})" "$ARCHIVE_DIR/$folder/$(basename ${log_file}).gz"
                        let new_files_archived++
                    fi
            done;
    done;
    echo $new_files_archived new files added to archive

    ## Remove file lock after executing
    rm $PIDFILE
0
задан 19 November 2019 в 00:57
1 ответ

Файл сценария отмечен как исполняемый файл т.е. 'x'? Который является владельцем? базироваться или Ваш обычный пользователь?

я лично предпочитаю квалифицировать команды т.е. обеспечивать полный путь, чтобы, например, найти так:

LOG_FILES=$(/bin/find -H ${LOG_DIR}/${folder} -not -empty -type f -name '*.log' -mtime -5)

имя использования вместо regex, потому что regex в этом случае больше не обеспечивает функциональность. Особенно, потому что соответствие regex'.' будет соответствовать любому символу, таким образом, это будет соответствовать 'helloslog', который Вы, вероятно, не хотите.

0
ответ дан 4 December 2019 в 23:47

Теги

Похожие вопросы