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데몬 파일을 다시 로드하고 아파치를 다시 시작했지만 성공하지 못했습니다.

내가 여기서 뭘 잘못하고 있는 걸까?

감사해요!

업데이트 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.

관련 정보