중복 실행을 처리하는 방탄 방법

배터리

내 라우터에 cron에 의해 30 분마다 실행되는 스크립트가 있습니다. 라우터는 때때로 두 번, 몇 초 간격으로 실행되지만 라우터가 부팅 될 때만 실행됩니다. 몇 주 전에 동시에 두 번 실행되는 것을 피하기 위해 pidof를 사용하여 파일 잠금 방법을 의도적으로 피하여 가능한 문제를 방지했습니다.

for pid in $(pidof DoubleDDNS); do
  if [ $pid != $$ ]; then
    echo "DoubleDDNS [no2run] Exiting"
    exit 1
  fi
done

그러나. 방금 문제가 생겼어요. 어떤 이유로 라우터가 깜짝 놀랐습니다. 내 스크립트가 완료되지 않았습니다. 영원히 기억에 갇혔습니다. 따라서 위의 검사는 원래 (이전) 실행이 작업을 완료하지 않은 동안 스크립트가 다시 실행되지 않도록했습니다. 이로 인해 문제가 발생했습니다 (새 WAN IP 주소를 DDNS에보고하지 않음).

스크립트에 멈출 수있는 명령이 없기 때문에 내 스크립트의 잘못이라고 생각하지 않습니다. 스크립트는 전혀 문제없이 여러 라우터에서 8 개월 이상 실행됩니다. 가능한 모든 오류에 대해 잘 작성, 처리 및 테스트됩니다. 라우터는 대부분 작동했지만 그 안의 많은 것들이 망가졌습니다 (예 : ssl). 라우터가 3 개의 메모리 중 어느 것도 채워진 것으로보고하지 않았습니다 (참일 수도 있고 아닐 수도 있음). 자체 WebGUI에서 재설정을 선택해도 재설정되지 않았고 켜기 / 끄기 버튼으로 재설정해야했습니다!

그렇다면 두 번째 실행을 위해 수표를 어떻게 방탄 처리합니까? 나는 생각하고있다 : 이전 인스턴스가 60 초 이상 실행되고 있는지 확인하고 그렇다면

  1. 오래된 인스턴스를 죽이려고
  2. 중복 실행에도 불구하고 계속하십시오. 스크립트는 매시간 3 분 및 33 분에 실행되며 단일 실행은 15 초 미만으로 지속됩니다.

질문 (바람직하게는 파일 생성이 없지만 파일 잠금을 피하는 것이 나쁜 해결책이었을 수 있으므로 조언하십시오) :

  1. 이전 실행이 얼마나 오래되었는지 감지하는 방법은 무엇입니까?
  2. 나보다 더 좋은 아이디어가 있습니까?
  3. 스크립트를 자살하는 방법이 있습니까? 스크립트가 60 초 내에 완료되지 않으면이 스크립트 인스턴스를 종료합니다.

주의 사항 : 라우터, sh 및 busybox. 따라서 제한된 항목을 사용할 수 있습니다. Asus 라우터 라우터 Asus RT-AC * U는 Merlin fw와 함께 사용됩니다.

배터리

여기 내 작업 방탄 버전의 모형이 있습니다. 논리를 보여주기 위해 조작되었습니다. 내 라우터에서 실행됩니다.

#!/bin/sh

age_max_sec=50

LOCKFILE=lock.txt
if [ -e ${LOCKFILE} ]; then
    echo "lockfile exists"
    if kill -0 `cat ${LOCKFILE}`; then
        echo "script runs in mem" 
        lock_date=`date -r ${LOCKFILE} +%s`
        now=`date +%s`
        lock_age=$(($now-$lock_date))
        if [ $lock_ag e -gt $age_max_sec ]; then
            echo "DoubleDDNS (no2runKILL)"
            kill `cat ${LOCKFILE}`
        else
            echo "DoubleDDNS (no2runOK), age $lock_age seconds, quit this run"
            exit 1
        fi   
    else
        echo "not allready running, go ahead"
    fi
fi

echo "working on"

# overkill???? just in case, scorched earth check.
filename=${0##*/}
for pid in $(pidof $filename); do
    if [ $pid != $$ ]; then
        echo "DoubleDDNS (no3runKILL)"
        kill -9 $pid
    fi
done

# make sure the lockfile is removed when we exit and then claim it
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
echo $$ > ${LOCKFILE}

# main program here

rm -f ${LOCKFILE}

echo "done"

이전 실행의 나이를 확인하려면 lockfile을 사용해야한다고 생각합니다. 따라서 pid로 잠금 파일을 만드십시오. lockfile이 설정된 제한 시간 (초)보다 오래되지 않은 경우 종료합니다. 오래된 경우 이전 인스턴스를 종료하십시오. 내 라우터에는 내가 확인한 더 좋은 방법이 없습니다.

그을린 지구 점검이 필요합니까 아니면 과잉입니까? 합법적 인 잠금 파일 검사가 완료된 후 메모리에 남아 있지만 손상된 프로세스가 있는지 다시 확인하고 발견되면 종료합니다. 문제는 결국 실제 재난이 다시 발생하고 정기적 인 정리로 정리할 수 없을 때까지 테스트 할 방법이 없다는 것입니다. 과잉이 아니라면 ...

NTP 서비스의 가용성은 시간 제한 잠금 및 자살 약에 영향을 미칠 수 있습니다. 예를 들어 위의 스크립트를 처음 실행하면 NTP가 시간을 수정하기 약 4 초 전에 실행됩니다. 그래서 우리는 그러한 것들을 고려해야합니다.

DopeGhoti가 위에서 제공 한 자살 약은 완벽하게 작동합니다. 이제 어떤 콤보를 사용할지 판단하는 문제입니다. 아니면 모두? Lockfile, 정기 석방, 그을린 지구 및 자살. 흠, 과격한 것처럼 들리지만 그들 중 누구도 다른 적들에 맞서 싸우지는 않지만 완벽한 (편집증적인) 조화로 보입니다. 의견을 환영합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

다중 처리 풀 실행을 일시 중지하는 방법

분류에서Dev

런타임 중에 중복 파일을 처리하는 방법

분류에서Dev

중복 행을 제거하는 방법

분류에서Dev

실행중인 프로세스의 삭제 된 바이너리 실행 파일을 복구하는 방법

분류에서Dev

Screenkey 실행을 중지하는 방법

분류에서Dev

복잡한 중첩 for 루프 집합을 처리하는 방법 vb.net

분류에서Dev

중복 열 이름으로 NHibernate 매핑 조인을 처리하는 방법

분류에서Dev

Laravel에서 중복 항목에 대한 QueryException을 처리하는 방법

분류에서Dev

ASP.NET MVC-Excel 업로드에서 중복을 처리하는 방법

분류에서Dev

중복을 잡는 방법?

분류에서Dev

Meteor에서 OAUTH를 사용하여 중복 계정을 처리하는 실용적인 방법?

분류에서Dev

WPF 작업을 사용하여 실행중인 작업을 처리하는 방법

분류에서Dev

단일 실행을 사용하여 테이블에 다중 삽입을 처리하는 방법

분류에서Dev

Firebase 쿼리 실행을 중지하는 방법 observe (eventType : with :)

분류에서Dev

파일을 반복하고 행을 실행하는 방법

분류에서Dev

파일을 반복하고 행을 실행하는 방법

분류에서Dev

파일을 반복하고 행을 실행하는 방법

분류에서Dev

외부 명령에 의한 비동기 처리 실행을 중지하는 방법

분류에서Dev

Apache Camel로 장기 실행 작업을 처리하는 방법

분류에서Dev

두 목록을 결합하는 동안 중복 키를 처리하는 방법은 무엇입니까?

분류에서Dev

중복성을 제거하는 방법

분류에서Dev

기본 키가 없을 때 mysql 조인을 사용하여 중복 삽입을 처리하는 방법-MySQL

분류에서Dev

Ruby에서 Faker의 중복 키를 처리하는 방법

분류에서Dev

중복 Firebase 앱 초기화를 처리하는 방법

분류에서Dev

yum을 깨뜨리는 중대한 실수에서 회복하는 방법

분류에서Dev

FastAPI에서 다중 처리를 수행하는 방법

분류에서Dev

중복 오류를 피하기 위해 선택 + 삽입을 처리하는 올바른 방법

분류에서Dev

SQL 오류 (1062)를 처리 (행 삭제)하는 방법 : MySQL의 UNIQUE 열에 중복 항목

분류에서Dev

반복 할 때 배열에서 null을 처리하는 방법

Related 관련 기사

  1. 1

    다중 처리 풀 실행을 일시 중지하는 방법

  2. 2

    런타임 중에 중복 파일을 처리하는 방법

  3. 3

    중복 행을 제거하는 방법

  4. 4

    실행중인 프로세스의 삭제 된 바이너리 실행 파일을 복구하는 방법

  5. 5

    Screenkey 실행을 중지하는 방법

  6. 6

    복잡한 중첩 for 루프 집합을 처리하는 방법 vb.net

  7. 7

    중복 열 이름으로 NHibernate 매핑 조인을 처리하는 방법

  8. 8

    Laravel에서 중복 항목에 대한 QueryException을 처리하는 방법

  9. 9

    ASP.NET MVC-Excel 업로드에서 중복을 처리하는 방법

  10. 10

    중복을 잡는 방법?

  11. 11

    Meteor에서 OAUTH를 사용하여 중복 계정을 처리하는 실용적인 방법?

  12. 12

    WPF 작업을 사용하여 실행중인 작업을 처리하는 방법

  13. 13

    단일 실행을 사용하여 테이블에 다중 삽입을 처리하는 방법

  14. 14

    Firebase 쿼리 실행을 중지하는 방법 observe (eventType : with :)

  15. 15

    파일을 반복하고 행을 실행하는 방법

  16. 16

    파일을 반복하고 행을 실행하는 방법

  17. 17

    파일을 반복하고 행을 실행하는 방법

  18. 18

    외부 명령에 의한 비동기 처리 실행을 중지하는 방법

  19. 19

    Apache Camel로 장기 실행 작업을 처리하는 방법

  20. 20

    두 목록을 결합하는 동안 중복 키를 처리하는 방법은 무엇입니까?

  21. 21

    중복성을 제거하는 방법

  22. 22

    기본 키가 없을 때 mysql 조인을 사용하여 중복 삽입을 처리하는 방법-MySQL

  23. 23

    Ruby에서 Faker의 중복 키를 처리하는 방법

  24. 24

    중복 Firebase 앱 초기화를 처리하는 방법

  25. 25

    yum을 깨뜨리는 중대한 실수에서 회복하는 방법

  26. 26

    FastAPI에서 다중 처리를 수행하는 방법

  27. 27

    중복 오류를 피하기 위해 선택 + 삽입을 처리하는 올바른 방법

  28. 28

    SQL 오류 (1062)를 처리 (행 삭제)하는 방법 : MySQL의 UNIQUE 열에 중복 항목

  29. 29

    반복 할 때 배열에서 null을 처리하는 방법

뜨겁다태그

보관