Я сделал это в прошлом на Windows Server 2003 с учетными записями домена, которым предоставляют вход в систему в интерактивном режиме и как сервисным правам и простому сценарию отображения диска, развернутому на тех учетных записях с групповой политикой сценария входа в систему. Это действительно работало, но это было некоторое время назад (и был для сервисного приложения прежней версии, которое не могло обработать пути UNC, конечно).
Какой windowsversion - это? Какие учетные записи Вы используете, локальный или доменный? Как Вы подключаете диски? Попытайтесь использовать политику запуска/сценария входа в систему. Возможно, для сервисов нужно старое, "взаимодействуют с настольным" флагом для этого, я не могу вспомнить прямо сейчас.
Просто удалите ветвление () из кода. К этой точке Вы записали часть кода, который Вы хотите отсоединить от консоли и выполнить в фоновом режиме. Однако, когда процессы, выполненные от inittab, они должны остаться приложенными. При удалении ветвления (), это останется приложенным к init, и init сможет контролировать/начинать/останавливать/перезапускать правильно
Я не могу говорить с Вашим inittab решением, надо надеяться, кто-то еще может, но я действительно хочу предложить, чтобы Вы посмотрели на "File::Pid" как на что-то для добавления к сценарию - после вызова daemonize (это важно - идентификационные изменения процесса после ветвления).
use File::Pid;
my $pidfile = File::Pid->new({
file => '/var/run/myprogram.pid',
pid => $$,
});
if ( my $num = $pidfile->running ) {
exit;
}
$pidfile->write;
Это дает Вам пару вещей - один она гарантирует, чтобы Вы не выполняли две копии ее одновременно (который, как Вы сказали, было грандиозное предприятие), и она также позволит Вам безопасно назвать эту программу каждый раз, когда Вы хотели обеспечить простую проверку активности. Просто назовите свой код от крона каждые 10 минут, и он ничего не сделает, если он будет работать, или перезапустите его, если он снижается.