Seguindo o post How to create custom script to run automatically during boot com algumas alterações/adaptações. Em nosso exemplo, vamos iremos mover os arquivos de um serviço FTP sempre que for feito o upload de um novo arquivo, para isso vamos:

  • Um script para ficar em loop lendo o log do serviço FTP e, para cada arquivo que for feito o upload com sucesso, se for um arquivo XML, mover o conteúdo para uma outra pasta;
  • Um serviço que inicie esse script, e;
  • Habilitar o serviço no Linux.

Verificando os pre requisitos

Antes de mais nada, verifique se você possuí os seguintes comandos (se não possuir, solucione primeiro)

tail
cut
vim
pkill

Criar um script para ficar em loop lendo um log e movendo

Primeiro, iremos ler e entender o log, em nosso caso do VSFTP. Lendo o log entendemos que o upload com sucesso gera os seguintes logs:

Sat Jun 26 12:49:19 2020 [pid 14005] [usuario_ftp] FTP command: Client “XX.XX.XX.XX”, “STOR imagem.jpg”
Sat Jun 26 12:49:19 2020 [pid 14005] [usuario_ftp] FTP response: Client “XX.XX.XX.XX”, “226 Transfer complete.”

Em nosso caso, vamos precisar do nome do arquivo, nesse caso imagem.jpg, além do resultado 226 Transfer complete. Como o log do FTP é gerado em /var/log/vsftpd.log vamos, então, deixar um loop para ler o arquivo, com o comando tail -F -n0 /var/log/vsftpd.log. Mas, precisaremos separar acima e obter somente os campos que nos interessa, para isso vamos usar o comando cut e separar em colunas, sempre que houver uma aspas duplas. Com isso a saída do arquivo que era:

Sat Jun 26 12:49:19 2020 [pid 14005] [usuario_ftp] OK UPLOAD: Client “XX.XX.XX.XX“, “arquivo.xml”, 61975 bytes, 0.50Kbyte/sec
Sat Jun 26 12:49:19 2020 [pid 14005] [usuario_ftp] FTP response: Client “XX.XX.XX.XX”, “226 Transfer complete.”

Ficará:

Coluna 1Coluna 2Coluna 3Coluna 4Coluna 5
Sat Jun 26 12:49:19 2020 [pid 14005] [usuario_ftp] OK UPLOAD: ClientXX.XX.XX.XX,arquivo.xml, 61975 bytes, 0.50Kbyte/sec
Sat Jun 26 12:49:19 2020 [pid 14005] [usuario_ftp] FTP response: Client XX.XX.XX.XX, 226 Transfer complete.

Por coincidência a coluna que sempre irá nos interessar será a 4, mas o que precisamos é o nome do arquivo e essa informação só aparece na linha que informa a transferência (com a informação Kbyte/sec). Além disso quando tivermos a informação 226 Transfer complete. deveremos mover o arquivo se ele for um xml. Vamos ao script (altere as partes em cinza conforme sua realidade):

touch /bin/script_ftp.sh
chmod 755 /bin/script_ftp.sh
vim /bin/script_ftp.sh

Dentro do arquivo, deixamos com o seguinte conteúdo:

!/bin/bash
tail -F -n0 /var/log/vsftpd.log | while read line; do
# Aqui vamos obter a quarta coluna como uma variável APENAS QUANDO a linha tiver a informação de transferência de arquivo
if [[ $line =~ “Kbyte/sec” ]]; then
filename=$(echo $line | cut -d\” -f4)
fi
# Aqui vamos verificar se foi uma transferência com sucesso
if [[ $line =~ “226 Transfer complete.” ]]; then
# Se foi uma transferência com sucesso, aqui iremos verificar se o arquivo (definido na linha que informava a taxa de tranferência) era um arquivo .XML)
if [[ $filename =~ “.XML” ]]; then
# Passando pelas validações, vamos mover copiar o conteúdo e apagar desse local
cp -r /home/usuario_ftp$filename /mnt/cifs_share
rm -rf /home/usuario_ftp$filename
fi
fi
done

Em nosso exemplo, movemos para a pasta /mnt/cifs_share mas lembre-se de alterar conforme sua realidade.

Criando e habilitando um serviço com o systemd

Se sua versão for um pouco mais recente, execute:

vim /etc/systemd/system/script_ftp.service

Dentro, adicione o seguinte conteúdo:

[Unit]
Description=Description for sample script goes here
After=network.target


[Service]
Type=simple
ExecStart=/bin/script_ftp.sh
TimeoutStartSec=0


[Install]
WantedBy=default.target

Salve e saia. Em seguida, execute os comandos:

systemctl daemon-reload
systemctl enable script_ftp.service
systemctl start script_ftp.service

Criando e habilitando um serviço com o /etc/init.d (linux antigos)

Se sua versão for um pouco mais antiga, execute:

touch /etc/init.d/script_ftp
chmod 755 /etc/init.d/script_ftp
vim /etc/init.d/script_ftp

Dentro, adicione o seguinte conteúdo:

!/bin/bash
#
# arquivos_despoluir Start/Stop the arquivos_despoluir daemon.
#
# chkconfig: 2345 90 60
# description: arquivos_despoluir

case “$1” in
start)
/bin/script_ftp.sh &
echo $!>/var/run/script_ftp.pid
;;
stop)
pkill -f script_ftp.sh
rm /var/run/script_ftp.pid
;;
restart)
$0 stop
$0 start
;;
status)
if [ -e /var/run/script_ftp.pid ]; then
echo arquivos_despoluir is running, pid=$(cat /var/run/script_ftp.pid)
else
echo arquivos_despoluir is NOT running
exit 1
fi
;;
*)
echo “Usage: $0 {start|stop|status|restart}”
esac
exit 0

Salve e saia. Em seguida, execute os comandos:

chkconfig --add script_ftp
chkconfig script_ftp on
/etc/init.d/script_ftp start

Fontes/Referências

https://blog.frd.mn/how-to-set-up-proper-startstop-services-ubuntu-debian-mac-windows/
https://linuxize.com/post/bash-check-if-file-exists/
https://qastack.com.br/server/29788/what-is-needed-for-a-linux-service-to-be-supported-by-chkconfig
https://serverfault.com/questions/29788/what-is-needed-for-a-linux-service-to-be-supported-by-chkconfig
https://stackoverflow.com/questions/160924/how-can-i-kill-a-process-by-name-instead-of-pid-on-linux
https://stackoverflow.com/questions/5133552/service-doesnt-support-chkconfig
https://stackoverflow.com/questions/54351442/shell-script-when-executed-appears-twice-is-the-process-list
https://thegeekdiary.com/centos-rhel-7-how-to-make-custom-script-to-run-automatically-during-boot/
https://unix.stackexchange.com/questions/185748/shell-script-is-executed-twice
https://unix.stackexchange.com/questions/236084/how-do-i-create-a-service-for-a-shell-script-so-i-can-start-and-stop-it-like-a-d
https://www.thegeekdiary.com/how-to-enable-or-disable-service-on-boot-with-chkconfig/

Mais Informações

Esperamos ter ajudado da melhor forma possível e estaremos sempre a disposição para mais informações.

Entre em contato conosco pelo e-mail equipe@nvlan.com.br.

NVLAN - Consultoria