Script de bash para testar se é a primeira segunda-feira do mês

1

Eu tenho um script bash que pega um punhado de arquivos e os configura para o FTP para um site que processa um dos arquivos de instalação. Nós estamos procurando encontrar o outro arquivo na primeira segunda-feira do mês, mas não tenho certeza de como colocar isso no script bash. Eu vi coisas usando o crontab, mas a primeira parte e a última parte do script seriam exatamente as mesmas e poderiam causar problemas se tivéssemos 2 scripts diferentes.

colocando apenas uma parte do script para a qual estou procurando fazer a alteração.

#!/bin/bash
...

e_file="/tmp/tmpemail.$(date +%s).txt"
file1='/usr/local/filename1'
file2='/usr/local/filename2'
relayserver='relay-server.example.com'

#ftp info
FTP_USER='ftpuser' #not the actual FTP User Name
FTP_DEST_PATH='/'

...

echo -e "Starting Tunnel and SFTP Process"
# make ssh tunnel for access to SFTP Site
ssh -L 9022:ftp.example.com:22 serviceaccount@$relay_server -Nf >/dev/null 2&>1
proc='ps -ef | grep "ssh -L 9022\:ftp.example.com\:22" | awk '{print $2}''

#checks to see if the tunnel opened correctly then proceeds to push to FTP Site
if [ "${proc}" != "" ]; then

    #looking for first monday, was thinking of first day but the crontab only runs on monday to friday
    ifStart='date '+%d''
    if [ $ifStart == 01 ]; then 

        echo -e "File 1 & File2 sent to FTP Site" >> $e_file
            $SFTP_CMD -oPort=9022 -b /dev/stdin $FTP_USER@localhost << END
        cd $FTP_DEST_PATH
        put $file1
        put $file2
        bye
END

    else

        echo -e "file 2 sent to FTP" >> $e_file
            $SFTP_CMD -oPort=9022 -b /dev/stdin $FTP_USER@localhost << END
        cd $FTP_DEST_PATH
        put $file2
        bye
END

    fi

    echo "killing ssh tunnel - $proc"
    kill $proc

else

...

Eu estou olhando para ser apontado na direção certa de obter a declaração if para a primeira segunda-feira do mês em que tenho que comentar localizado. Alguma idéia para contornar isso?

Nota adicionada: Este script deve ser executado todos os dias da semana do mês para fazer o upload dos arquivos a serem processados.

    
por thebtm 24.05.2018 / 22:38

3 respostas

8

Eu não tenho tempo para ler todo o roteiro, mas aqui está a ideia: com o comando date obtém o nome do dia da semana:

we=$(LC_TIME=C date +%A)

( LC_TIME=C é usado para obter o nome em inglês do dia da semana)

e depois começa o dia no mês

dm=$(date +%d)

e, em seguida, verifique se o dia é menor que 8 e o dia da semana é segunda-feira:

if [ "$we" = "Monday" ] && [ "$dm" -lt 8 ]
then 
.....
fi
    
por 24.05.2018 / 22:49
3

Coloque no crontab :

0 1 * * 1 [[ "$(/bin/date +\%d" -le 7 ]] && /path/to/script.sh

Em todas as segundas-feiras às 01:00, ele verificará se a data é menor ou igual à sétima e, se for o caso, executará o script.

O bônus para usar isso é que é muito fácil reagendar para as terças-feiras sem ter que editar o script.

    
por 24.05.2018 / 23:06
2

Você pode fazer o cron executar um script toda segunda-feira e fazer com que o script verifique se o dia do mês é de 1 a 7.

Essa verificação pode ser integrada no seu script principal ou você pode escrever um script de wrapper para que você não precise fazer essa alteração no script principal para que ele possa ser executado.

if [[ $(date +%d) =~ 0[1-7] ]]; then
    : run script
fi

Verificando o dia da semana e o dia do mês:

if [[ $(date +%w%d) =~ 10[1-7] ]]; then
    : run script
fi
    
por 24.05.2018 / 22:45