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
.
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!
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
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