У меня есть задание 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
Файл сценария отмечен как исполняемый файл т.е. 'x'? Который является владельцем? базироваться или Ваш обычный пользователь?
я лично предпочитаю квалифицировать команды т.е. обеспечивать полный путь, чтобы, например, найти так:
LOG_FILES=$(/bin/find -H ${LOG_DIR}/${folder} -not -empty -type f -name '*.log' -mtime -5)
имя использования вместо regex, потому что regex в этом случае больше не обеспечивает функциональность. Особенно, потому что соответствие regex'.' будет соответствовать любому символу, таким образом, это будет соответствовать 'helloslog', который Вы, вероятно, не хотите.