Como “agora” no FreeBSD?

0

Existe uma maneira de executar at imediatamente no FreeBSD?

No Ubuntu, quando executo um script com "agora", ele é executado imediatamente. Com o FreeBSD, há um atraso porque está sendo executado no crontab. O padrão é 5m.

*/5     *        *       *       *       root    /usr/libexec/atrun

Eu mudei para correr a cada 1m.

*/1     *        *       *       *       root    /usr/libexec/atrun

1m ainda é uma longa espera. Existe alguma maneira de rodar o at imediatamente no FreeBSD como eu posso no Ubuntu?

editar : Aqui está o código que estou usando para executar o comando at . at now é executado imediatamente no Ubuntu, mas não no FreeBSD. Eu não tenho idéia de como descobrir como at está rodando no Ubuntu, mas o FreeBSD está rodando no crontab scheduling causando o atraso.

shell_exec("echo /usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} | at now");

editar : Tentando executar atrun imediatamente após manualmente (em vez de esperar pelo cron) produz o seguinte erro.

atrun: setegid failed: Operation not permitted

Não sei como consertar isso em termos de dar permissão ao usuário para executar seus próprios comandos agendados.

    
por quickblueblur 01.03.2016 / 18:21

1 resposta

1

Ampersand é seu amigo

Por favor, não corra com uma tesoura. Você está fazendo perguntas muito válidas por todas as razões erradas.

at usa cron para agendar trabalhos no futuro. Eles são ótimas ferramentas para esse propósito. Mas quando você está usando ferramentas de agendamento para fazer as coisas agora, você está atravessando a água para encher o balde. MelBurslan aponta isso para você e lhe dá a resposta correta. Você então tenta esclarecer sua necessidade - mas, infelizmente, sente falta de seu ponto. Você insiste em usar at - quando você deve simplesmente usar o e comercial & .

Para outros leitores - a questão é mais do tipo "Como faço para que o php rode (crie) outro script e continue sem esperar que o script termine?".

Isto irá levá-lo a um grande conhecimento fundamental sobre Unix, como mostra MelBurslan:

nohup /path/to/myprogram & 2>&1
  • nohup garante que o comando continuará sendo executado em segundo plano, mesmo que o usuário atual efetue logout.

  • & é o que você provavelmente está faltando: o Ampersand desconecta o processo e o envia para segundo plano.

  • 2>&1 une stderr (2) com stdout (1) e nohup , em seguida envia implicitamente a saída para nohup.out

Se você não adicionar o "e" comercial - então o chamador (aqui php) esperará até que o trabalho termine.

Se você, em seguida, descer a toca do coelho como cas aponta - você pode ver como as pessoas estão usando essa técnica com shell_exec e exec (consulte aqui )

Informações importantes adicionais para entender a partir disso:

Se você não está interessado em nenhum resultado, pode enviá-lo para /dev/null da seguinte forma:

> /dev/null

Isso redirecionará stdout . Se você também não quer mensagens de erro, você pode redirecionar stderr assim:

 2> /dev/null

Você pode combiná-los em uma linha:

 > /dev/null 2> /dev/null

E há uma forma resumida disso - enviar stderr para stdout - e enviar stdout para "nothing":

  > /dev/null 2>&1

Então, vamos colocar esse conhecimento em prática:

Seu exemplo faz mau uso de at :

shell_exec("echo /usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} | at now");

Mas se você simplesmente quiser continuar com o script, basta adicionar o "e" comercial &

shell_exec("/usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} &");

Se você não usa nenhuma saída, você deve redirecioná-la.

shell_exec("/usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} > /dev/null 2>&1 &");

E a versão mais elegante sugerida por Brent Braisley seria:

exec("nohup /usr/bin/php -q scripts/myfile.php {$var1} {$var2}  > /dev/null 2>&1 &");

Uso excessivo de

O comando at agenda os comandos a serem executados pelo script atrun .

Se você ler a página de manual para at , você encontrará:

 Note that at is implemented through the cron(8) daemon by calling
 atrun(8) every five minutes.  This implies that the granularity of at
 might not be optimal for every deployment.  If a finer granularity is
 needed, the system crontab at /etc/crontab needs to be changed.

Você já ajustou o crontab. Eu aconselho contra isso no seu caso. Mas se você insistir, deve olhar para man crontab (5) :

   string        meaning
   ------        -------
   @reboot       Run once, at startup of cron.
   @yearly       Run once a year, "0 0 1 1 *".
   @annually     (same as @yearly)
   @monthly      Run once a month, "0   0 1 * *".
   @weekly       Run once a week, "0 0 * * 0".
   @daily        Run once a day, "0 0   * * *".
   @midnight     (same as @daily)
   @hourly       Run once an hour, "0   * * * *".
   @every_minute Run once a minute, "*/1 * * * *".
   @every_second Run once a second.

Isso significa que você pode alterar */1 (por uma vez por minuto) para @every_second .

Mas - por favor - não: -)

Correndo manualmente manualmente

Você não deve usar de forma incorreta atrun conforme sugerido. "All" (no seu contexto) adiciona o e comercial & para executar seu trabalho em segundo plano.

O motivo mais provável é que você (como deveria estar!) esteja logado como usuário comum. Apenas root tem permissão para usar at por padrão. Se você precisar mudar isso, dê uma olhada na página do manual em e:

 /var/at/at.allow        allow permission control
 /var/at/at.deny         deny permission control

Mas - mais uma vez - por favor - não: -)

Se tudo falhar ...

Se tudo falhar, por favor, refaça sua pergunta. Obter a ferramenta de agendamento para executar agora não é a causa raiz do seu problema. Se o acima não for suficiente, então precisamos cavar mais fundo.

    
por 08.03.2016 / 16:00

Tags