Използвам следното, за да поддържам единичен екземпляр на скрипт, работещ на моя сървър. Имам 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%. Би било хубаво, ако мога да проверя дали процесът наистина е увиснал/не е активен, но не знам дали има лесен начин да направя това (и не искам да имам много фалшиви положителни резултати, когато се убива, но е работи добре).