2017-01-28 3 views
0

나는 이것이 정말로 간단 할 것이라고 생각했지만 분명히 아니었다.아파치 PHP 스크립트 (Ubuntu 14.04)에서 시그널 SIGUSR1을 데몬으로 보내는 방법

데몬 (현재 정상적으로 실행 가능한 파일로 테스트 중)이 있으며 웹 페이지에서 수행하는 작업을 제어해야합니다. 가운데에 앉아있는 것은 필요한 모든 데이터가 양방향으로 전달되는 MySQL 데이터베이스입니다. 모두 같은 기계에 있습니다.

웹 페이지에서 명령을 내리면 PHP는 적절한 데이터를 데이터베이스에 저장하고 데몬이 해당 데이터를 읽고 작동합니다. 여태까지는 그런대로 잘됐다.

그러나 데몬은 데이터베이스를 폴링하므로 시간이 지체됩니다. 내가하고 싶은 것은 daemon에게 'look now'라고하는 메시지를 보냅니다. 그래서 나는 신호를 보내겠다고 생각했다. - SIGUSR1.

이것은 신호가 명령 줄 (kill -SIGUSR1 ....)에서 보내지지만 PHP - system ("kill -SIGUSR1 ....")에서 보내지는 경우에는 정상적으로 작동합니다.

내 생각 엔 - 내부 셸 명령이므로 셸 스크립트에 kill 명령을 넣으십시오. 다시 말하지만, 아파치 PHP 시스템() API가 아니라 명령 행에서 실행할 때 잘 작동합니다.

PHP posix_kill()을 사용하여 동일한 작업을 시도했지만 실패했습니다.

사용 권한 문제 인 것으로 보입니다. Apache 스크립트 사용자에게 kill 명령을 실행할 수있는 권한이 없습니다. 그래서 나는 생각했다. OK - 어쨌든 테스트를 위해서 - 스크립트를 작성했다. SUID 스크립트를 사용할 수 없으므로 SUID 스크립트가 나타납니다.

sudo는 system() 호출의 스크립트이며 /etc/sudoers.d에 스크립트와 사용자 (www-data)를 추가하므로 sudo 암호 프롬프트가 표시되지 않습니다. 스크립트의 kill 또는 pkill 명령은 여전히 ​​코드 1 (사용 권한이 거부 됨)으로 돌아 오지만 루트로 실행 중입니다.

그래서 막혀 있습니다. 그것은 간단하게 보입니다 - 데몬에게 '깨우기'를 말하는 신호를 보냅니다. 그러나, 나는 그것을하는 방법을 찾을 수 없습니다.

답변

0

글쎄, 아주 이상한, 재부 팅 후 다른 변경 sudo는 갑자기 접근 방식을 변경합니다. 요약 :/usr/local/bin에

  1. 는 스크립트 (pkill에)를 포함 만들기 명령
  2. 장소 및 실행이
  3. 은/etc /가 sudoers에 (이 명령의 sudoers에 새 파일을 WWW 데이터를 추가 할 .d)
  4. 시스템에서 PHP 아파치 스크립트를 호출 ("sudo/usr/local/bin/script_ name")
관련 문제