내 컴퓨터에는 작은 Mumble 음성 서버를 실행할 수 있는 사용자가 몇 명 있습니다. 나는 그들이 웹사이트(Apache에 의해 실행)에서 음성 서버를 시작/중지할 수 있기를 원합니다. 현재 설정에서는 각 서버를 다른 사용자(해당 사람의 특정 사용자 계정)로 실행합니다.
내가 모르는 것은 서버를 즉시 시작/중지하는 가장 좋은 방법입니다. 현재는 웹사이트에서 서비스를 시작/중지하려고 할 때마다 데이터베이스에 항목을 만듭니다. 그런 다음 매분 실행되고 데이터베이스에서 이러한 시작/중지를 찾는 cron 스크립트가 있습니다. cron 스크립트는 사용자 계정으로 전환하고 해당 사용자로 서버를 실행합니다. 내 문제는 이런 일이 발생하는 데 약 1분이 걸릴 수 있다는 것입니다.
이를 달성하는 더 민감한 방법이 있습니까?
답변1
데이터베이스에 쓰는 것 외에도 명명된 파이프에 쓰는 것을 고려해 보셨나요? 사용자별로 명명된 파이프를 만든 다음 각 명명된 파이프를 모니터링하는 프로세스를 만들 수 있습니다. "restart" 명령이 오면 즉시 프로세스를 다시 시작하십시오.
이는 완전한 솔루션은 아니며 개선될 수 있지만 명명된 파이프를 모니터링하고 프로세스를 다시 시작하는 방법에 대한 아이디어를 제공해야 합니다.
while read line <$pipe
do
if [[ "$line" == 'restart' ]]; then
restart_some_service
fi
done
답변2
이것은 약간 지나친 것일 수도 있지만, 고려해 본 적이 있습니까?사용자 분? 그들은 프로세스 플러그인을 나열합니다표준 플러그인, 사용자가 다음을 수행할 수 있도록 합니다.
시스템에서 실행 중인 모든 프로세스를 보고, [그들]에 속한 프로세스를 종료하고, 새 프로세스를 시작합니다.
(이것을 시도한 적이 없습니다, 단지 그것이 꽤, 음, "전문적"일 것이라고 생각했습니다. )
(편집하다 'Mumble'에 관해서는이미 일부 웹 인터페이스가 있습니다., 그러나 귀하의 경우에 도움이 될지 모르겠습니다. )
답변3
서버를 호스팅하는 사람들이 신뢰할 수 있고 서버에 스팸/해킹을 하지 않을 경우, 시작/중지를 쉘에 직접 전달하도록 웹 인터페이스를 프로그래밍하는 것은 어떨까요?
예를 들어, PHP에서는 다음과 같이 페이지에 프로그래밍할 수 있습니다.
<?php
// checks, templating, blah, blah, blah
$status = exec('/path/to/service/mumbled status')
if ($status == "stopped")
// display start button, hook exec('mumbled stop') command to it
if ($status == "running")
// display stop button, hook exec('mumbled start') command to it
?>
나라면 그 길로 가겠지만 그게 바로 나다.
답변4
귀하의 크론 방법이 정확합니다. 대부분의 다른 방법에는 다양한 보안 문제가 있습니다. 동일한 아이디어를 더 빨리 얻으려면 파일을 터치하고 inotify를 사용하여 파일이 수정되었는지 감지할 수 있습니다. inotify는 매우 빠릅니다. "inotify-tools"는 inotify를 사용하기 위한 사용하기 쉬운 명령줄 도구 세트입니다. inotify-tools github 사이트에는 몇 가지 좋은 예가 있습니다.
에서: https://github.com/rvoicilas/inotify-tools/wiki/#wiki-info
#!/bin/sh
EVENT=$(inotifywait --format '%e' ~/file1)
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
기본적으로 즉각적입니다. inotify는 커널 기능이며 이러한 도구는 커널을 활용하여 특정 파일 시스템 이벤트에 대한 요청을 알립니다.