Como executar um script de shell novamente e novamente tendo X intervalo de tempo na raiz? [duplicado]

-1

Eu tenho um shell script no meu Ubuntu Server 14.04 LTS em ./ShellScript.sh . Eu configurei /etc/rc.local para executar o script de shell após a inicialização, mas antes do login usando o código abaixo.

Para executar o comando execute boot, escreva este comando no terminal: sudo nano /etc/rc.local , depois adicione e salve.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

#!/bin/bash

./ShellScript.sh

exit 0

Nota: lembre-se de que estou trabalhando no modo root . Agora, quando executo crontab -e , recebi o seguinte. Agora o que fazer?

no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano        <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]:

Depois de selecionar 2 , recebi crontab: "/usr/bin/sensible-editor" exited with status 2

Agora eu quero executar / executar este script de shell de novo e de novo com 15min de intervalo de tempo entre cada execução após a inicialização, mas antes do login. Então, posso fazer isso?

Resposta:

Primeiro de tudo, você não pode acessar crontab -e via root. Você precisa fazer o login através da conta do USUÁRIO. Após o login na conta do usuário, vá para o terminal e digite crontab -e Aqui você vai ter algum texto como abaixo.

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

Agora eu = no final do arquivo, você precisa adicionar */15 * * * * /ShellScript.sh line para executar seu script cada após 15 min. Agora salve o arquivo e pronto.

Nota: Se você quiser um intervalo de tempo diferente para executar o script novamente e novamente, não fique confuso. Aqui estão algumas ferramentas online que irão gerar linhas Cron para você.

  1. link
  2. link
  3. link
  4. link
  5. link
por Muhammad Hassan 19.08.2014 / 10:07

1 resposta

3

Você não pode simplesmente executá-lo em segundo plano, dentro de um loop while:

while true
 do
    [command]
    sleep [number of seconds]
 done

Então a construção seria:

  • Adicione uma linha em /etc/rc.local para chamar seu script (seu ShellScript.sh ) + "& amp;" para fazê-lo sair
  • Execute os comandos que você quer que o ShellScript.sh execute em um loop while (dentro de Shellscript.sh ):

    while true
     do
        [command_1]
        [command_2]
        [command_3]
        [command_4]
        sleep 900
     done
    

Dessa forma, ele seria executado na inicialização e, a partir de então, a cada 15 minutos

Observe que, se você quiser executá-lo a partir de cron , precisará definir o caminho completo, pois cron é executado com um conjunto limitado de variáveis de ambiente.

Exemplo:

Eu criei um script bobo, adicionando uma linha com a string "monkey" em um arquivo test.txt na minha área de trabalho:

o script :

#!/bin/bash

while true
 do
    echo monkey>>/home/jacob/Desktop/test.txt
    sleep 5
 done

A linha no meu arquivo /etc/rc.local :

sh /home/jacob/Desktop/while.sh &

Isso é tudo.

    
por Jacob Vlijm 19.08.2014 / 10:21