Linux Single Instance Kill, ако работи твърде дълго

Използвам следното, за да поддържам единичен екземпляр на скрипт, работещ на моя сървър. Имам cronjob, за да изпълнявам това всяка минута.

Как да демонизирам произволен скрипт в unix?

#!/bin/bash

if [[ $# < 1 ]]; then
    echo "Name of pid file not given."
    exit
fi

# Get the pid file's name.
PIDFILE=$1
shift

if [[ $# < 1 ]]; then
    echo "No command given."
    exit
fi

echo "Checking pid in file $PIDFILE."

#Check to see if process running.
PID=$(cat $PIDFILE 2>/dev/null)
if [[ $? = 0 ]]; then
    ps -p $PID >/dev/null 2>&1
    if [[ $? = 0 ]]; then
        echo "Command $1 already running."
        exit
    fi
fi

# Write our pid to file.
echo $$ >$PIDFILE

# Get command.
COMMAND=$1
shift

# Run command
$COMMAND "$*"

Сега разбрах, че скриптът ми е увиснал по някаква причина и затова е заседнал. Бих искал начин да проверя дали $PIDFILE е "стар" и ако е така, убийте процеса. Знам, че това е възможно (проверете клеймото за време на файла), но не знам синтаксиса или дали това изобщо е добра идея. Освен това, когато този скрипт работи, процесорът трябва да е доста силно използван. Ако увисне (рядко, но се е случвало поне веднъж досега), използването на процесора пада до 0%. Би било хубаво, ако мога да проверя дали процесът наистина е увиснал/не е активен, но не знам дали има лесен начин да направя това (и не искам да имам много фалшиви положителни резултати, когато се убива, но е работи добре).


person Matt    schedule 02.05.2012    source източник


Отговори (1)


За да отговорите на въпроса във вашето заглавие, който изглежда доста различен от вашия проблем, използвайте timeout.

Сега, за вашия проблем, не виждам къде може да виси, освен ако не сте му дали fifo опашка за pid файла. Сега, за да стартирате и възобновите, можете просто да стартирате този скрипт веднъж, при стартиране:

#!/bin/bash

while /bin/true; do
    "$@"
    wait
done

Което води до друг бъг в кода, който сте получили от другия въпрос: "$*" ще предаде всички аргументи на скрипта като единичен аргумент; без кавичките ще раздели аргументите с бяло пространство. "$@" ще ги предаде поотделно и ще обработва празното пространство правилно.

Обадете се с /path/to/script command [argument]....

person Kevin    schedule 02.05.2012
comment
Благодаря, наистина не знам достатъчно за bash скриптовете (напр. "$*" срещу "$@") и сега разбирам защо получавах странни грешки, когато стартирах командата в началото. И времето за изчакване изглежда като това, което искам. - person Matt; 03.05.2012