Разные результаты при запуске скрипта с помощью cron, чем при выполнении вручную

#bash #shell #cron

#bash #оболочка #cron

Вопрос:

У меня есть скрипт, который выполняет некоторые вызовы curl для списка назначений, найденных в list.txt файл, использующий ключи, найденные в keys.txt каждый результат вызова сохраняется в другом текстовом файле, который начинается с имени сервера _show_counters. Когда я запускаю этот скрипт вручную, он работает правильно и выдает мне правильные ответы с правильных серверов, найденных в list.txt но при запуске с помощью cron предоставленная информация соответствует не нужному серверу, а другому, который находится на 4 позиции позже в списке.

это код:

 #!/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/puppetlabs/bin
temp=/local/scripts/shell/checker/temp/
timestamp=$(date  '%Y_%m_%d--%H:%M:%S')

paste $temp"list.txt" $temp"keys.txt" > $temp"combined.txt"
awk '{ printf "https://%s//api/?type=opamp;cmd=blablablaamp;key=%sn", $1, $2}' $temp"combined.txt" > $temp"allCurls.txt"

count=1
for crl in `more  1 ${temp}allCurls.txt`
do
        filename=`awk -v count=$count 'NR==count{print $1}'  ${temp}list.txt`
        filekey=${filename}
        filename="$temp${filename}_show_counters.txt"
        curl -k $crl > ${filename}
        echo curl -k   $crl  >> $temp"curls_debug.txt"
        count=$((count 1))
done
  

Это содержимое cron:

 0,10,20,30,40,50 * * * * /local/scripts/shell/checker/checker.sh > /dev/null 2>amp;1
  

Я уже пытался отредактировать cron, чтобы начать с приведенных ниже команд, но это не имеет значения.

 SHELL=/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/puppetlabs/bin 
  

Я обнаружил ошибки в / var / spool / mail / ниже, затем все последовательные завитки выполняются правильно, что затем приводит к неправильному порядку в предоставленных результатах.

 curl: (6) Couldn't resolve host '::::::::::::::'
curl: (3) <url> malformed
curl: (6) Couldn't resolve host '::::::::::::::'
  

Итак, я добавил echo curls_debug.txt для и найдено:

 curl -k ::::::::::::::
curl -k /local/scripts/shell/checker/temp/allCurls.txt
curl -k ::::::::::::::
  

Это происходит только при выполнении с помощью cron, если я запускаю этот скрипт вручную, то curls_debug.txt показывает завитки в ожидаемом формате, состоящем из curl -k https://server_name command key начиная с самого первого curl и, следовательно, приносит правильные результаты.

Может кто-нибудь из вас, пожалуйста, помочь мне посмотреть, что здесь не так и как это исправить?, большое спасибо.

Ответ №1:

Это предположение, но я подозреваю, что это связано с использованием more для чтения файла — more это интерактивный инструмент, и его не следует использовать в неинтерактивных сценариях. Использование cat было бы лучше, но while read ... done <file цикл, как правило, лучший способ сделать это. И вместо того, чтобы использовать беспорядочный набор промежуточных файлов, я бы просто использовал один комбинированный while read цикл для параллельного чтения обоих файлов (через файловые дескрипторы # 3 и # 4, просто чтобы сохранить чистоту) и объединить информацию из двух файлов напрямую:

 #!/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/puppetlabs/bin
temp=/local/scripts/shell/checker/temp
timestamp=$(date  '%Y_%m_%d--%H:%M:%S')

while read domain <amp;3 amp;amp; read key <amp;4; do
    crl="https://${domain}//api/?type=opamp;cmd=blablablaamp;key=${key}"
    filename="${temp}/${domain}_show_counters.txt"
    curl -k "$crl" > "${filename}"
done 3<"${temp}/list.txt" 4<"${temp}/keys.txt"
  

Примечание: я также убрал кавычки (как правило, ссылки на переменные должны быть в двойных кавычках) и оставил конец / вне temp переменной (я считаю, что гораздо понятнее добавлять его при использовании переменной — дает понять, что мы ссылаемся на файл в этом каталоге).).

Комментарии:

1. привет, Гордон, спасибо за ваши предложения. ну, не уверен, что «больше» было проблемой, но я заменил эту часть кода на предложенную while, и это исправило проблему, так что большое спасибо за вашу помощь.