Сценарий оболочки, который никогда не умирает

Почему использование awk? sed лучше в этом:

sed -ne 's/.*\(http[^"]*\).*/\1/p' < foo.js
0
24.10.2013, 17:59
4 ответа

Используйте crontab задание для вызова сценария.

crontab -e

Добавьте следующую строку

* * * * * /path/to/your/script

Этот wil выполняет Ваш сценарий каждую минуту. Можно проверить здесь, как настроить в течение другого времени выполнения. Страница справочника Crontab

Извините, что я пропустил требование для выполнения каждых 5 secs. Но как Jonnhy, упомянутый в комментариях, у Вас может быть cronjob, проверяющий, работает ли сценарий или нет.

Сценарий для crontab:

#!/usr/bin/bash
ps -ef|grep -v grep |grep script_name
if [ $? != 0 ]; then
    path/to/script/script_name
fi

В Вашем сценарии:

#!/usr/bin/bash
while true; do
    #perform the test        
    sleep 5
done

Или если Вы используете Linux, который все еще основан на init сценариях, Вы можете, возможно, запись в/etc/inittab

10:35:respawn:/path/ro/your/script

Хотя я не действительно уверен - ли это лучшая практика, чтобы иметь это в inittab.

Если Ваша система уже с systemd, существует также способ выполнить это, но у меня нет опыта с ним для помещения его здесь.

8
28.01.2020, 02:13
  • 1
    +1 на этом. Нет никакого пути к trap a kill -9 так вытаскивание сценария называет из таблицы процессов, когда его не нужным является в значительной степени единственный другой способ минимизировать риск, что кто-то будет когда-либо пытаться уничтожить его (который является тем, что OP спрашивает о). списки –  Bratchley 24.10.2013, 19:01
  • 2
    Так как он хочет, чтобы сценарий работал каждые 5 секунд, Крон не будет выполнять его достаточно часто. Но он мог вызывать сценарий каждую минуту и иметь его проверка, чтобы видеть, работает ли он уже, и выйдите сразу, если это. Тем путем сценарий только был бы мертв в течение самое большее минуты, прежде чем крон запустит его снова. –  Johnny 24.10.2013, 19:46
  • 3
    crontab страница справочника, упомянутая @BitsOfNix, перечисляет основное использование для команды crontab, но опции настройки могут быть найдены путем выполнения man 5 crontab или путем навигации здесь. –  Timothy Martin 24.10.2013, 21:25

Вместо того, чтобы использовать сценарий с бесконечным циклом, используйте сценарий, который выполняет задачу однажды, но сначала спит в течение 5 секунд, затем называет себя в фоновом режиме:

sleep 5
$0 &
# do whatever

Это предполагает, что сценарий находится в $PATH, так как он вызывается только с именем ($0).

Если сценарий умирает / уничтоженный во время, "делают любой", следующее повторение будет все еще работать.

1
28.01.2020, 02:13
  • 1
    Если "делают любая" задача зависает, это рискует исчерпывать процессы или память на машине. И если сценарий будет уничтожен, в то время как он спит, он не будет иметь шанса вызвать себя снова, таким образом, он прекратит работать. –  Johnny 24.10.2013, 19:43
  • 2
    @Johnny я полностью согласен; это - действительно эскиз тактики, которая могла использоваться, если существует определенная проблема, посредством чего сценарий умирает в, "делают что". Это - предположение, которое включает OP быть несколько плохим или ленивым коммуникатором, значение, если это не будет применимо, то он или она поймет, что, но если это, он или она, возможно, не думал о вещах этот путь, и это - опция. –  goldilocks 24.10.2013, 21:16

Если у Вас есть полномочия пользователя root, можно поместить сценарий или в/etc/inittab или в/etc/init/script.conf, в зависимости от которого система использует. Используйте записи для/sbin/getty как пример процесса, который всегда перезапускается, когда он умирает.

1
28.01.2020, 02:13
  • 1
    inittab предложение является выполнимым для систем стиля SysV, которые используют его, но /etc/init/script.conf не эквивалентно и не будет работать в способе, которым Вы предлагаете. –  goldilocks 24.10.2013, 21:40

Пока процесс не умирает через SIGKILL, можно использовать trap, например:

#!/bin/bash

trap "" SIGHUP SIGINT SIGTERM

count=0
while ((1)); do
    echo $count
    sleep 2;
    count=$(($count+1));
done    

Вы не можете Ctrl-C (SIGTERM) это. Если Вы хотите, чтобы это остановилось, необходимо использовать kill -9 [pid].

1
28.01.2020, 02:13
  • 1
    SIGQUIT (^), мог также быть отправлен для завершения вместо того, чтобы использовать shouldn't-be-used SIGKILL. –  Arcege 24.10.2013, 23:03
  • 2
    @Arcege - Вы уверенный? Попробуйте его; O –  goldilocks 24.10.2013, 23:10
  • 3
    я не заметил хижину удара; я только использую семантику Bourne сам и никогда не замечал различия с trap в Bash. –  Arcege 25.10.2013, 04:31

Теги

Похожие вопросы