Configurando o Systemd para executar script extra após o início / reinício do httpd usando a configuração do ExecStartPost não funcionando

0

Eu preciso que um arquivo PHP seja executado sempre que o serviço link for iniciado ou reiniciado. Descobri que o Systemd tem uma configuração chamada ** ExecStartPost , que parece perfeito para o que preciso fazer.

Eu atualizei o arquivo /etc/systemd/system/multi-user.target.wants/httpd.service para refletir o seguinte:

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecStartPost=/bin/php /usr/sbin/php_test
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

O conteúdo de / usr / sbin / php_test é:

#!/bin/php

<?php
echo "Writing to /tmp/php-test.txt...\n";

$myfile = fopen("/tmp/php-test.txt", "w") or die("Unable to open file!");
$txt = "TEST! " . date("F j, Y, g:i a") . PHP_EOL;
fwrite($myfile, $txt);
fclose($myfile);

echo "Done!!\n";
?>

Então eu chmod 777 o arquivo php e recarreguei os arquivos do daemon via systemctl daemon-reload . Mas quando eu reinicio o httpd, ele não cria o arquivo /tmp/php-test.txt que eu esperava ver.

Se eu executar o /bin/php /usr/sbin/php_test através da linha de comando, ele funcionará perfeitamente bem.

Encontrei um tópico StackOverflow afirmando que o Systemd lê os arquivos .service de baixo para cima, então eu movi a linha ExecStartPost para logo acima da linha ExecStart , recarreguei os arquivos daemon e reiniciei o apache novamente, sem sucesso ...

O que estou fazendo de errado aqui?

Obrigado!

Atualização 1

Alterei o arquivo httpd.service para o seguinte:

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecStartPost=/bin/bash -c "/bin/php -f /tmp/php_test"
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

E agora recebo um erro (pelo menos isso é algo para continuar!). Quando reviso os registros via journalctl -xe , vejo o seguinte:

Apr 19 12:47:46 silo-stg-a01.cymedica.com systemd[1]: Starting The Apache HTTP Server...
-- Subject: Unit httpd.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit httpd.service has begun starting up.
Apr 19 12:47:46 silo-stg-a01.cymedica.com bash[13268]: Could not open input file: /tmp/php_test
Apr 19 12:47:46 silo-stg-a01.cymedica.com systemd[1]: httpd.service: control process exited, code=exited status=1
Apr 19 12:47:47 silo-stg-a01.cymedica.com systemd[1]: Failed to start The Apache HTTP Server.
-- Subject: Unit httpd.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit httpd.service has failed.
--
-- The result is failed.
Apr 19 12:47:47 silo-stg-a01.cymedica.com systemd[1]: Unit httpd.service entered failed state.
Apr 19 12:47:47 silo-stg-a01.cymedica.com systemd[1]: httpd.service failed.

O erro é Não foi possível abrir o arquivo de entrada: / tmp / php_test . Não sei o que isso significa ainda.

E eu estou ciente de que prefixar o comando com um hífen permitiria que o processo continuasse mesmo se o arquivo PHP não fosse executado, mas não é isso que estou tentando corrigir. Eu preciso do script PHP para executar corretamente.

FYI , se você está se perguntando por que eu o executei     / bin / bash -c "/ bin / php -f / tmp / teste_php"

e não apenas     / bin / php -f / tmp / php_test

Eu estava apenas brincando com a tentativa de executar o script php a partir de um comando bash. Mas se eu alterá-lo para apenas /bin/php -f /tmp/php_test , obtenho exatamente o mesmo erro em journalctl

Atualização 2

Eu noto que se eu substituir a linha ExecStartPost pelo comando PHP com apenas:

ExecStartPost=/bin/logger "ExecStartPost 1"

(que vai logo após a linha ExecStart ), ele registra ExecStartPost 1 nos logs muito bem ... Então eu acho que é relacionado a como o arquivo php em si é executado

    
por justin hyland 19.04.2016 / 21:39

1 resposta

1

Você tem em seu arquivo de unidade:

PrivateTmp=true

Isso significa que o systemd criará um namespace separado para os diretórios /tmp e /var/tmp da unidade. Remova a linha para usar o usual /tmp .

    
por 19.04.2016 / 22:19