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

Я уже пробовал nohup, screen, disown (в оболочке netcat /bin /sh), но все они не справились с этой задачей.

Программа, которая должна быть запущена, также нуждается в аргументах.

РЕДАКТИРОВАТЬ: Комментарии попросили меня упомянуть проблемы с методами, которые я попробовал.

nohup: закрытие окна NetCat также закрывает процесс

bg: При запуске NetCat сообщает: "Нет управления заданиями в этом сеансе"

disown: тот же результат, что и у nohup

экран: "Должен быть подключен к терминалу"

2 ответа2

0

Замените "bash foo.sh" на то, что вам нужно для запуска. не переживет перезагрузки.

perl -e "if(fork){exit}else{exec(\"bash foo.sh\")}"

edit: вы можете напечатать $$ в файл в else, до exec, если вы хотите захватить pid. Вы также можете просто выполнить вывод PS для уничтожения на основе pid.

0

Во-первых, сценарий оболочки не может предотвратить завершение какого-либо (фонового) процесса, если ОС решит его убить или процесс умирает. С учетом сказанного, вот предложение о том, как перезапустить службу. Это грубо, но просто.

Создайте файл "семафор" и используйте его, чтобы разорвать вечный цикл, который перезапускает какую-то работу.

#!/bin/sh

function run {
    local t=`mktemp  /tmp/service.XXX`
    touch $t
    while [ -f $t ]; do
        # restart a job here, e.g
        nc -l -p 4444 & pid=$!
        echo $pid > $t
        wait $pid
    done 
}

function stop {
    local pf=`ls /tmp/service.*| wc -l`
    if [ $pf -gt 1 ]; then
        echo why are there several pid files?

    elsif [ $pf -lt 1 ]; 
        echo nothing to stop

    else 
        pid=`cat /tmp/service.*`
        rm -f /tmp/service.*
        kill $pid
    fi
}

Исходный файл в вашей оболочке и запустить функции. Скрипт может содержать ошибки, но идея должна быть пригодной для использования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .