#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, и это исправило проблему, так что большое спасибо за вашу помощь.