Скрипт оболочки для запуска процесса и предотвращения его завершения

0

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

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

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

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

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

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

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

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

John
источник
1
Запуск программы на экране, в tmux или в nohup & amp; все должно работать. Вы уже упомянули большинство из них. Почему это не работает? С какими проблемами вы столкнулись?
Hennes
Добавлены проблемы с использованными командами.
John
Как вы пытались использовать экран? Как только вы находитесь в сеансе экрана, вы находитесь в терминале. Если вы попытались выполнить команду непосредственно из командной строки, т.е.% screen myCommand, то у вас не будет контрольного терминала. Просто введите screen, запустите команду после получения нового приглашения. Затем вы можете закрыть окно, и ваш сеанс экрана продолжится.
skarface
pastebin.com/9JKx0wd8 Кажется, это кто-то пытается сделать то же самое.
skarface

Ответы:

0

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

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

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

skarface
источник
Из ОП: «нужно бежать бесконечно много времени, пока я не решу убить его» - не уверен, что перезагрузка включена.
slhck
затем добавьте вышеупомянутое в ваши загрузочные скрипты. очень мало, что автоматически переживет перезагрузку. nohup / screen / etc, конечно, нет.
skarface
Мне просто нужно, чтобы он работал, пока система работает.
John
О, я думаю, что вы не поняли. Я просто думал о том, «как убить его».
slhck
Я думаю, что я должен быть в состоянии убить его, используя kill -9 PID
John
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
}

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

Ярослав Рахматуллин
источник
Я думаю, что ОП просит что-то, что будет работать, даже когда контрольная сессия умрет. Вышеуказанное сделает что-то устойчивым к уничтожению, но не остановит процесс от смерти, когда контрольный сеанс завершится. Вам нужно где-то раскошелиться.
skarface
Ты прав. Я забыл упомянуть, что он должен работать на экране.
Ярослав Рахматуллин