Como executar o programa após concluir um processo

0

Então, eu tenho o arquivo backup.php que cria um backup da conta do usuário. Usando top -c | grep nome de usuário, pude ver que o processo está em andamento,

top -c | grep newin mostra abaixo

11334 root      39  19  128m  38m 7036 S 10.3  0.1   0:00.57 pkgacct - newin - av: 4 - write compressed stream
11351 newin     39  19  130m  33m 2792 S  3.7  0.1   0:00.11 pkgacct - newin - av: 4 - create tar stream
11334 root      39  19  128m  38m 7036 S  9.3  0.1   0:00.85 pkgacct - newin - av: 4 - write compressed stream
11351 newin     39  19  130m  34m 2792 S  1.3  0.1   0:00.15 pkgacct - newin - av: 4 - create tar stream
11334 root      39  19  128m  38m 7036 S 10.6  0.1   0:01.17 pkgacct - newin - av: 4 - write compressed stream
11412 newin     39  19 83172  16m 3856 S  1.7  0.1   0:00.05  /usr/local/cpanel/bin/ftpput /bacupdrive

Quero executar o mail.sh assim que o processo de backup estiver concluído

você pode, por favor, fornecer alguma ajuda nisso?

Obrigado.

user8863627
fonte
Eu usei backup.php apenas por exemplo. Você pode me dar uma solução de trabalho para shell script e eu a usarei no meu script. Tudo que eu quero é encontrar processo de usuário está executando ou não e se não há nenhum processo para o usuário, execute mail.sh roteiro Agradecimentos
user8863627

Respostas:

1

Eu não tenho um servidor Web no Linux, então não sei quais processos serão iniciados quando um phpscript for executado, mas alguns pontos me ocorrem.

(1) A maneira mais fácil de verificar se um programa está em execução é usar pidof, o que retornará um erro se não for encontrado, por exemplo, para esperar até que um processo seja concluído, use:

while pidof ProcessName; do sleep 1; done
mail.sh

(2) No entanto, se um script terminar e reiniciar dentro de um segundo, você poderá perder a finalização, portanto precisará de um script mais elaborado:

if p="$(pidof ProcessName)"
then while [ "$(pidof ProcessName)" == "$p" ]; do sleep 1; done
fi
mail.sh

Isso garantirá que o PID não mude, como acontecerá em uma nova encarnação do ProcessName.

Obviamente, a duração do atraso precisará ser escolhida como um equilíbrio entre a velocidade com a qual você deseja responder à rescisão e a sobrecarga das verificações com excesso de frequência.

Uma solução melhor seria se o seu servidor da Web tivesse um recurso embutido para iniciar um comando na conclusão de um phpscript.

AFH
fonte
1

Use o seguinte comando:

backup.php && mail.sh

o &&é um operador booleano AND. Uma vez backup.phpconcluído sem erro, ele será executado mail.sh. Se backup.phplançar um erro, mail.shnão será executado.

Se você não se importa se backup.phpgera um erro, use um ;(ponto e vírgula) em vez de &&:

backup.php; mail.sh

Nesse caso, mail.shserá executado após qualquer rescisão de backup.php.

Keltari
fonte
Obrigado. mas isso executa o mail.sh sem verificar se o processo de backup.php está concluído ou não. Eu acho que preciso enquanto e se mais loop aqui.
user8863627
@ user8863627 Seu comentário está errado. Qualquer um dos dois comandos começa novo backup.php e quando sai mail.shé executado (ou não, no caso de &&status de saída diferente de zero). Se você deseja acionar mail.shquando o já iniciado backup.phpterminar (sua pergunta não está clara sobre isso), então esta resposta não se aplica, use a resposta do AFH . Também se backup.phpbifurca- se no fundo; ou gera crianças em segundo plano, as repudia e sai; ou aciona qualquer daemon para fazer algo e sai - então você pode considerar que "não foi concluído" quando formalmente está.
Kamil Maciorowski