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
unestderr
(2) comstdout
(1) enohup
, em seguida envia implicitamente a saída paranohup.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.