httpd 起動/再起動が機能しない後に追加のスクリプトを実行するように ExecStartPost 設定で Systemd を構成する

httpd 起動/再起動が機能しない後に追加のスクリプトを実行するように ExecStartPost 設定で Systemd を構成する

いつでもPHPファイルを実行する必要があります。httpdサービスが開始または再起動されます。 Systemdに**という構成設定があることがわかりました。起動を実行した後、私がしなければならないことにぴったりです。

/etc/systemd/system/multi-user.target.wants/httpd.service以下を反映するようにファイルを更新しました。

[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

内容は/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";
?>

その後、PHPファイルをchmod 777として実行すると通過しますsystemctl daemon-reload。ただし、httpdを再起動すると、予想される/tmp/php-test.txtファイルは生成されません。

コマンドラインから実行すると/bin/php /usr/sbin/php_test正常に動作します。

一つ見つけました。StackOverflow スレッドSystemdが.serviceファイルを下から上に読んでいるため、ExecStartPost行を上に移動してExecStartデーモンファイルを再ロードしてApacheを再起動しましたが、成功しませんでした。

私がここで何を間違っているのか?

ありがとうございます!

アップデート1

httpd.serviceファイルを次に変更しました。

[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

これでエラーが発生します(少なくとも続く! )。ログを見ると、journalctl -xe次の内容が表示されます。

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.

エラーは次のとおりです。入力ファイルを開くことができません:/tmp/php_test..まだそれが何を意味するのかよく分からない。

コマンドの前にハイフンを付けると、PHPファイルが実行されなくてもプロセスが続行されることがわかりますが、これは私が解決しようとする問題ではありません。正しく実行するにはPHPスクリプトが必要です。

参考までに、なぜ私が/bin/bash -c "/bin/php -f /tmp/php_test"を実行させたのか疑問に思うなら

/bin/php -f /tmp/php_test だけでなく

私はbashコマンドからPHPスクリプトを実行しようとしました。しかし、単に変更すると、/bin/php -f /tmp/php_test同じエラーが発生します。journalctl

アップデート2

ExecStartPost行をPHPコマンドに置き換えると、次のようになります。

ExecStartPost=/bin/logger "ExecStartPost 1"

(該当行の直後ExecStart)、ログを残します。1 実行開始後ログには問題はありません...それで、PHPファイル自体の実行方法に関連しているようです。

ベストアンサー1

組織ファイルには次のものがあります。

PrivateTmp=true

これは、systemdがユニットと/tmpディレクトリに対して/var/tmp別々の名前空間を作成することを意味します。一般的な/tmp

おすすめ記事