Как я могу запустить скрипт от крона только однажды за один раз?

SSL должен явно быть включен в конфигурации сервера. В Apache можно включить другой виртуальный хост (в дополнение к одному на стандартном порте 80) и установить его для работы порта 443 для HTTPS.

Вам дополнительно нужен сертификат SSL, который будет стоить денег (если Вы не выберете самоподписанный сертификат). Если Вы не платите за реальный сертификат, пользователи сайта HTTPS хорошо получают страшные предупреждения о недопустимых сертификатах.

2
задан 14 October 2010 в 23:19
6 ответов

Мои извинения embobo, но я скопировал его сценарий и изменил его для устранения состояния состязания, которое я отметил в своем комментарии к его ответу:

#!/bin/sh
LOCKDIR=/var/run/myprog.lock
mkdir --mode=700 $LOCKDIR || exit 0
trap "{ rm -rf $LOCKDIR ; exit 0; }" EXIT
# do stuff

В основном мы рассчитываем на то, что создание каталога является атомарным, так, чтобы только одна копия этого сценария, работающего одновременно, могла успешно создать $LOCKDIR. Вероятно, лучше удостовериться это $LOCKDIR находится на локальном диске, не на диске NFS или Samba монтируются, и т.д.

10
ответ дан 3 December 2019 в 08:31

Вы могли использовать файл блокировки. Код оболочки в качестве примера:

#!/bin/sh
LOCKFILE=/var/run/myprog.pid
[ -f $LOCKFILE ] && exit 0
trap "{ rm -f $LOCKFILE ; exit 0; }" EXIT
echo "$$" > $LOCKFILE
# do stuff

Важно удостовериться, что файл блокировки удален в любом виде выхода (нормальный или аварийный). Именно это trap команда делает.

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

4
ответ дан 3 December 2019 в 08:31

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

В псевдокоде:

if (!exists(/var/run/filename))
{
    touch /var/run/filename;
    do stuff;
    rm /var/run/filename;
}
2
ответ дан 3 December 2019 в 08:31

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

По моему опыту, это, оказалось, было более надежным.

1
ответ дан 3 December 2019 в 08:31

Существует "lockfile" двоичный файл, установленный в большинстве систем, которые можно использовать, чтобы не входить в игру удара, пишущего сценарий oneupsmanship. На RHEL/CentOS/Fedora его часть procmail пакета.

Таким образом, Вы могли поместить что-то как:
lockfile /var/lock/mycron.lock && /usr/local/bin/mycron && rm -f /var/lock/mycron.lock

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

1
ответ дан 3 December 2019 в 08:31

Кажется, мне удалось на следующий вызывающий скрипт:

#!/bin/zsh
RED_="\033[31m"
BLUE_="\033[34m"
BLACK_="\033[0m"
if [ $# -lt 1 ]; then
 echo "$0: Invoke a program/script only once at a time"
 echo "Syntax: $0 <program/script with parameters>"
else
 if ps -Alf | grep "$*" | grep -v grep | grep -v $0 >/dev/null; then
  echo "$BLUE_\"$@\"$RED_ runs already. I don't invoke it.$BLACK_"
 else
  echo "${RED_}I invoke: $BLUE_$@$BLACK_"
  $@
 fi
fi
0
ответ дан 3 December 2019 в 08:31

Теги

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