현재를 기준으로 한 타임스탬프를 사용하여 Solaris에서 스크립트를 호출하는 방법은 무엇입니까?

현재를 기준으로 한 타임스탬프를 사용하여 Solaris에서 스크립트를 호출하는 방법은 무엇입니까?

목록 오류 쉘 스크립트가 있지만 매일 수동으로 실행합니다. crontab스크립트를 자동으로 실행 하고 싶습니다 .

내 스크립트:

#!/bin/sh
ent programe -a$1 -b$2 -c$3 -d$4 -tTE -oListErrorTE.txt
grep " ERR1" ListErrorTE.txt
grep " ERR2" ListErrorTE.txt

설명하다:

$1 = date start >> 20230914
$2 = time start >> 000100
$3 = date end >> 20230914
$5 = time end >> 163000

2시간 이전에 시작하는 매개변수 날짜/시간을 바꾸고 종료 날짜/시간을 현재 날짜/시간으로 바꾸고 싶습니까?

답변1

스크립트는 명령줄에서 시작 날짜 및 시간과 종료 날짜 및 시간에 해당하는 4개의 매개변수를 사용하며 특정 매개변수를 지정하지 않고 스크립트를 호출하려는 것으로 보입니다. 대신 시작 날짜와 시간을 "2시간 전"으로, 종료 날짜와 시간을 "지금"으로 설정하려고 합니다.

Solaris 시스템에 dateGNU가 설치되어 있다고 가정합니다(유틸리티상장됨공식 Solaris 매뉴얼에 있으므로 최소한 관리자가 제공할 수 있음) 이를 사용하여 다음과 같이 네 가지 매개변수의 값을 계산할 수 있습니다.

/some/path/yourscript \
    "$(date -d '2 hours ago' +%Y%m%d)" \
    "$(date -d '2 hours ago' +%H%M%S)" \
    "$(date +%Y%m%d)" \
    "$(date +%H%M%S)"

이 명령이 2023년 9월 14일 09:44:03에 실행된 경우 스크립트는 4개의 매개변수 20230914, 074403및 와 함께 20230914호출됩니다 094403.

네 가지 명령 대체는 GNU를 사용하여 date필요한 네 가지 날짜 및 타임스탬프를 계산하고 반환합니다.

걱정하는 네 가지 호출 중 일부가 date초, 분, 시간, 일 등의 서로 다른 측면에 있는 경우 먼저 "지금"이라는 Unix 타임스탬프를 얻고 date해당 타임스탬프의 오프셋을 사용하여 원하는 타임스탬프를 얻습니다. 날짜 및 시간 스탬프:

now=$(date +%s)

offset=$(( -2*60*60 ))    # -2h in seconds

/some/path/yourscript \
    "$(date -d "@$(( now + offset ))" +%Y%m%d )" \
    "$(date -d "@$(( now + offset ))" +%H%M%S )" \
    "$(date -d "@$now" +%Y%m%d )" \
    "$(date -d "@$now" +%H%M%S )"

GNU는 없지만 date상당히 최신 버전 bash(버전 4.2 이상)이 있습니다.공식 문서):

printf -v now '%(%s)T' -1

offset=$(( -2*60*60 ))    # -2h in seconds

/some/path/yourscript \
    "$( printf '%(%Y%m%d)T' "$(( now + offset ))" )" \
    "$( printf '%(%H%M%S)T' "$(( now + offset ))" )" \
    "$( printf '%(%Y%m%d)T' "$now" )" \
    "$( printf '%(%H%M%S)T' "$now" )"

이는 이전 코드 조각과 유사한 방식으로 printf내장 유틸리티의 특수 날짜 형식 지정 기능을 사용합니다. bash먼저 Unix 타임스탬프 "지금"(셸 변수에 저장 now)을 계산한 다음 이를 사용하여 "2시간 전" 오프셋을 계산하고 형식이 지정된 날짜와 타임스탬프를 스크립트에 대한 인수로 출력합니다.

크론 작업의 경우 코드 조각을 가져와서 예약합니다. yourscript-runner매우 긴 명령을 crontab 파일에 직접 삽입하려고 시도하는 것보다 cron으로 예약된 별도의 스크립트에 코드를 넣는 것이 가장 합리적일 것입니다. %부분적으로는 해당 문자가 cron 예약에서 특별하고 이스케이프되어야 하기 때문입니다. 또한 원하는 경우 작업을 수동으로 실행할 수 있는 별도의 스크립트도 제공합니다.

0 0 * * * /some/path/yourscript-runner

(위의 크론 일정은 매 자정마다 실행됩니다.)

답변2

표준 Solaris 시스템(GNU 날짜 없이)에서 이 작업을 수행하는 것이 가능합니다(약간의 수평적 사고를 통해).

2시간마다 스크립트를 실행하도록 크론 작업을 설정합니다.

입력 시 스크립트가 실행 date되고 현재 날짜와 시간을 "시작" 매개변수로 저장합니다.

그런 다음 7200초 동안 절전 모드로 전환됩니다.

절전 모드가 만료되면 date다시 실행되어 현재 날짜와 시간을 "end" 매개변수로 저장합니다.

이제 처음 2시간 동안의 데이터를 추출하는 데 필요한 4개의 값이 생겼습니다. 결과 파일 이름의 일부로 종료 시작 및 날짜를 ​​사용할 수도 있습니다.

답변3

버전 11부터 Solaris에는 /bin/sh실제로 고급 날짜 조작 및 형식 지정 기능이 내장되어 있습니다(실제로 GNU보다 훨씬 더 고급).ksh93printfdate

명시적으로 표준 구문이 아니라고 말하는 #! /bin/ksh93 -대신 ksh93 구문을 사용하겠습니다 ( bash 시스템의 스크립트에서 bashism을 사용 하지 않는 것처럼 ).#! /bin/sh -sh#! /bin/sh -sh

#! /bin/ksh93 -
eval "${
  printf '
    ent programe %(-a%Y%m%d -b%H%M%S)T %(-c%Y%m%d -d%H%M%S)T -tTE -oListErrorTE.txt
  ' '2 hours ago' now
}"
grep ' ERR1' ListErrorTE.txt
grep ' ERR2' ListErrorTE.txt

관련 정보