Melhor abordagem seria usar um script de wrapper, que irá chamar o script principal. Isso ficaria assim:
#!/bin/bash
# This is /home/user/bin/wrapper.sh file
pkill -f 'main_script.sh'
exec bash ./main_script.sh
É claro que o wrapper deve ser nomeado de forma diferente. Dessa forma, pkill
pode pesquisar apenas por seu script principal. Desta forma, o seu script principal reduz a isso:
#!/bin/sh
cd /home/user/spiders/goods
PATH=$PATH:/usr/local/bin
export PATH
scrapy crawl good
Observe que, no meu exemplo, estou usando ./
porque o script estava no meu diretório de trabalho atual. Use o caminho completo para o seu script para obter melhores resultados
Eu testei essa abordagem com um script principal simples que apenas executa o script infinito while loop e wrapper. Como você pode ver na captura de tela, o lançamento da segunda instância do wrapper elimina a anterior
Seu script
Este é apenas um exemplo. Lembre-se de que não tenho acesso ao escasso para realmente testar isso, então ajuste isso conforme necessário para sua situação.
Sua entrada no cron deve ter esta aparência:
0,30 * * * * /home/us/jobs/scrapy_wrapper.sh
Conteúdo de scrapy_wrapper.sh
#!/bin/bash
pkill -f 'run_scrapy.sh'
exec sh /home/us/jobs/run_scrapy.sh
Conteúdo de run_scrapy.sh
#!/bin/bash
cd /home/user/spiders/goods
PATH=$PATH:/usr/local/bin
export PATH
# sleep delay now is not necessary
# but uncomment if you think it is
# sleep 2
scrapy crawl good