завершить сценарий другого пользователя - PullRequest
3 голосов
/ 19 июля 2010

На коробке с Linux у меня есть скрипт на python, который всегда запускается от предопределенного пользователя. Для его завершения может потребоваться некоторое время, поэтому я хочу позволить другим пользователям остановить его из Интернета.

Использование kill завершено неудачно, операция не разрешена.

Могу ли я каким-то образом изменить свой долго работающий скрипт на python, чтобы он получал сигнал от другого пользователя? Очевидно, что другой пользователь запускает веб-сервер.

Может быть, есть совершенно другой способ решения этой проблемы, о котором я сейчас не могу думать.

Ответы [ 4 ]

1 голос
/ 19 июля 2010

Если вы настроили свой скрипт python для запуска на вашем сервере как deamon (внизу страницы под Unix Daemon) (это звучит правильно), и вы предоставляете пользователю apache разрешения на выполнение init. Сценарий d для службы, затем вы можете управлять службой с помощью php-кода, подобного следующему (от здесь - имя сценария службы в данном случае 'otto2'):

<? 
$otto = "/usr/etc/init.d/otto2 "; 

if( $_GET["action"] ) { 
    $ret = shell_exec( $otto.$_GET["action"] ); 
    //Check your ret value  
} 
else { 
    ?> 
    <a href="<?=$PHP_SELF?>?action=start">Start  </a> 
    <a href="<?=$PHP_SELF?>?action=stop">Stop  </a> 
    <? 
} 

?>

Примечание по этому поводу - «действительно простой непроверенный код»:)

1 голос
/ 19 июля 2010

Если вы не хотите выполнять команду kill с правильными разрешениями, вы можете отправить любой другой сигнал другому сценарию. В этом случае ответственность других скриптов прекращается. Вы не можете заставить его, если у вас нет разрешения на это.

Это может произойти с сетевым подключением или с файлом «kill», существование которого проверяется другим сценарием, или с чем-либо еще, что сценарий может прослушивать.

1 голос
/ 19 июля 2010

Вдобавок ко всему, одним из решений было бы создание потока сценария и ожидание сигнала уничтожения через ту или иную форму.Или вместо многопоточности у вас может быть файл, который скрипт проверяет каждый N раз через цикл - тогда вы просто записываете сигнал уничтожения в этот файл (который, конечно, имеет права на запись для веб-пользователя).Я не очень знаком с kill, кроме как убивать свои собственные сценарии, так что может быть лучшее решение.

0 голосов
/ 19 июля 2010

Вы можете использовать sudo для выполнения команды kill от имени пользователя root, но это ужасная практика.

Как насчет того, чтобы длительный скрипт проверял какое-то условие каждые x секунд, например, наличие файла типа /tmp/stop-xyz.txt? Если этот файл найден, скрипт немедленно завершает свою работу.

(или любые другие средства межпроцессного взаимодействия - это не имеет значения.)

...