LINUX.ORG.RU
ФорумAdmin

Костыли на bash.Запустить скрипт в бесконечном цикле

 


0

1

Добрый день,

стоит задача запускать некий скрипт в бесконечном цикле в бэкграунде и если он каким-то образом умрет или хост ребутнется - перезапустить цикл.

скрипт, который нужно запускать - tests.sh

До чего дошел:

tests_run.sh

while true
do
 /root/tests.sh 2>/dev/null
 sleep 5
done

И запускается он вот так:

ps x | grep [t]ests_run.sh > /dev/null && echo "running" || nohup bash /root/tests_run.sh

Вопрос, как мне nohup bash /root/tests_run.sh запустить в бэкграунде? Если просто поставить & в конце, то все команда запуститься в бэкграунде.

Может есть более изящное решение?

Ответ на: комментарий от fedorino_gore

Если тот что с ps то может просто греп не найти результатов и вернуть -1. Если тот что с циклом - ТС же написал что может ребутнуться. Или кильнуть кто-то может.

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)

более изящное решение?

init скрипт (systemd unit в новомодном случае)

sin_a ★★★★★
()
Ответ на: комментарий от fedorino_gore

По каким причинам скрипт может умереть?

Кто-то найдет этот вирус и прибьет

handbrake ★★★
()
grep [t]ests_run.sh

Так не пойдет - ппид скрипта будет принадлежать /bin/bash, а «потомки» будут отображаться как слип или как что там у тебя еще есть в этом вложенном скрипте. Так что не лепи сразу в автозагрузку, а то будет у тебя классная форк-бомба.

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)

Напиши демон и скрипт инициализации. Все осальное - костыли.

TDrive ★★★★★
()
Ответ на: комментарий от Funny_sailor

Так все равно.

$ cat run.sh 
while true
do
  sleep 5
done

$ ./run.sh &
[1] 5267

$ ps -ef | grep 5267
alozovs+  5267  1160  0 11:57 pts/0    00:00:00 /bin/bash
alozovs+  5336  5267  0 11:57 pts/0    00:00:00 sleep 5
alozovs+  5341  1160  0 11:57 pts/0    00:00:00 grep 5267
alozovskoy ★★★★★
()

Есть еще вариант поставить daemontools (или аналог) и в run для сервиса прописать:

#!/bin/sh

/root/tests.sh 2>/dev/null
sleep 5

zunkree
()
screen -ls roottest || screen -d -m -S roottest watch -n 5 /root/tests.sh
sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 2)
$
$ cat ./test.sh
#!/bin/bash

sleep 5

$
$ false || { ./test.sh & }
[1] 14594
$ jobs
[1]+  Running                 ./test.sh &
$
$
[1]+  Done                    ./test.sh
$
anonymous
()
Ответ на: комментарий от Funny_sailor

Убери эти костыли и прочитай man pgrep

maloi ★★★★★
()

Если не systemd - man inittab. Ключевое слова respawn. Как раз для этих целей создавалось.

Kroz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.