Вывод sed в bash скрипт работает в CLI, вывод отличается в cron - PullRequest
0 голосов
/ 12 декабря 2018

Простой скрипт для перечисления сайтов на моем сервере Webinoly Ubuntu 18 работает в CLI, но не работает в cron.Webinoly - это скрипт управления сайтом, в котором есть команда для перечисления сайтов, которыми он управляет:

site -list

Вывод этой команды в CLI выглядит следующим образом:

 - catalyst.dk39ecbk3.com
 - siteexample3.com
 - webinoly.dk39ecbk3.com

СкриптУ меня возникли проблемы с (ниже) должен удалить управляющие символы, "-" в начале каждой строки, а также пустые строки с помощью sed:

#!/bin/bash

# create array of sites using webinoly 'site' command
# webinoly site -list command returns lines that start with hyphens and spaces, along with control chars, which need to be removed
# SED s/[\x01-\x1F\x7F]//g removes control characters
# SED s/.{7}// removes first seven chars and s/.{5}$// removes last 5 chars
# SED /^\s*$/d removes blank lines
# removing characters http://www.theunixschool.com/2014/08/sed-examples-remove-delete-chars-from-line-file.html
# removing empty lines https://stackoverflow.com/questions/16414410/delete-empty-lines-using-sed

SITELIST=($(/usr/bin/site -list | sed -r "s/[\x01-\x1F\x7F]//g;s/.{7}//;s/.{5}$//;/^\s*$/d"))

#print site list

for SITE in ${SITELIST[@]}; do
echo "$SITE"
done

Вот желаемый вывод, который я вижув CLI:

root@server1 ~/scripts # ./gdrive-backup-test.sh
catalyst.dk39ecbk3.com
siteexample3.com
webinoly.dk39ecbk3.com

Проблема возникает, когда скрипт выполняется в cron.Вот файл cron:

root@server1 ~/scripts # crontab -l
SHELL=/bin/bash
MAILTO=myemail@gmail.com
15 3 * * 7 certbot renew --post-hook "service nginx restart"
47 01 * * * /root/scripts/gdrive-backup-test.sh > /root/scripts/output-gdrive-backup.txt

, а вот файл output-gdrive-backup.txt, сгенерированный командой cron:

root@server1 ~/scripts # cat output-gdrive-backup.txt
lyst.dk39ecbk3
example3
noly.dk39ecbk3

Первые три символа каждой строки отсутствуют,как и последние четыре (.com).

Я исследовал и убедился, что принудительно использовал bash в файле cron, а также в начале скрипта.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Ответ оказался невозможностью указать TERM в моем файле cron.Это решило основную проблему, с которой я столкнулся.Это была странная проблема - ее трудно было исследовать и выяснить.

Было несколько других - одна из них заключалась в том, что путь для одной из команд не был частью пути, который использует cron, нобыл включен в пользовательский корень в CLI.Дополнительные сведения о проблеме TERM см. В сообщении "tput: нет значения для $ TERM и не указано -T", зарегистрированном процессом CRON .

0 голосов
/ 12 декабря 2018

С помощью следующего ввода:

$ cat site 
 - catalyst.dk39ecbk3.com

 - siteexample3.com

 - webinoly.dk39ecbk3.com

 - webinoly.dk39ecbk3.com

вы можете использовать следующую команду sed для получения вашего результата:

$ cat site | sed -e "s/^\s*-\s*//g;/^\s*$/d"
catalyst.dk39ecbk3.com
siteexample3.com
webinoly.dk39ecbk3.com
webinoly.dk39ecbk3.com

Замените cat site на команду, которую вы хотитеотфильтровать вывод от.

...