Здравствуйте!
Столкнулся с необходимостью выполнять команды reboot и halt из php скрипта. Веб сервер lighttpd и php-fcgi запущены с минимальными правами юзера nobody. Проблема в том, что reboot и halt может запускать только суперпользователь и, поэтому, из php скрипта они не срабатывают. Подскажите, пожалуйста, как элегантым образом решить эту проблему.
Вот для примера 3 варианта реализации:
- Реализация с помощью крона, интервал проверки минимум 1 минута:
Code:#!/bin/sh mkdir -p /var/spool/cron/crontabs /usr/sbin/crond echo '* * * * * [ -e /tmp/reboot ] && reboot' | /usr/bin/crontab -- Реализация с бесконечным циклом в скрипте, интервал проверки минимум 1 секунда:
Code:#!/bin/sh (while :; do [ -e /tmp/reboot ] && reboot sleep 1 done) &- Реализация на си, интервал проверки минимум 1 секунда:
Code:#include <stdlib.h> #include <unistd.h> #include <sys/stat.h> int main(int argc, char *argv[]) { struct stat stats; pid_t pid = fork(); if (pid > 0) return 0; if (pid < 0) return 1; for(;;) { if (!stat("/tmp/reboot", &stats)) system ("reboot"); sleep (1); } }
Спасибо за предложенные реализации.
Первый вариант с кроном не подходит, так как слишком велик интервал проверки.
Исследовал второй вариант на sh. Третий вариант на C пока пробовать не стал, так как под рукой нет компилятора. Зато есть perl, поэтому заменил его аналогичной реализацией:
Интересно, что судя по показаниям htop, вариант на sh дает пиковую нагрузку на процессор до 2-3%, тогда как для варианта на perl показания htop вообще всегда нулевые. Понятно, что реализация на perl отъедает в 5-6 раз больше пямяти. Теперь буду думать что же выбрать.Code:#!/opt/bin/perl use strict; defined (my $pid = fork) or die "Can't fork: $!"; exit 0 unless $pid == 0; while(1) { exec('reboot') if -e '/tmp/reboot'; sleep(1); }
Поделитесь рабочей командой с использованием plink.exe для использования в батнике что-то типа этого
только так у меня не работаетCode:start plink -ssh -batch -l root -pw ***** 192.168.1.11 /opt/etc/init.d/S99rtorrent start
а почему имя пользователя root? В асусах же по умолчанию имя пользователя admin.
Имею WL-500W c последней прошивкой от Олега.
Корбина + L2TP
Проблема в том, что через 5-7 дней аптайма рутер виснет намертво.
Лечится передергиванием питания.
ВОПРОС:
Как мне прикрутить к рутеру скрипт автоматической перезагрузки, например раз в 5 дней?
И чтобы он это помнил после перегруза по питанию?
Спасибо заранее за помощь
cron (crond) уже есть в прошивке, ставить отдельно не обязательно
А если запрограммировать кнопку EZ-SETUP на перезагрузку и нажимать её в критических ситуациях?
Спасибо, нашел подробный туториал!
http://wl500g.info/showpost.php?p=15933&postcount=3
Все настроил
Last edited by Dusha; 05-01-2009 at 12:08.