cron이 다시 시작할 때까지 특정 시간에 스크립트를 중지하는 방법은 무엇입니까?


12

OSMC (Debian 기반)를 실행하는 Raspberry Pi가 있습니다.

자정에 스크립트 sync.sh를 시작하도록 크론 작업을 설정했습니다.

0 0 * * * /usr/local/bin sync.sh

오전 7시에 스크립트를 중지해야합니다. 현재 나는 사용하고 있습니다 :

0 7 * * * shutdown -r now

더 좋은 방법이 있습니까? 재부팅이 과도하다고 생각합니다.

감사

답변:


25

timeout명령으로 실행할 수 있습니다 .

timeout - run a command with a time limit

Synopsis
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]
Description

Start COMMAND, and kill it if still running after NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. 

추신. 동기화 프로세스에 시간이 너무 오래 걸리면 데이터 동기화를위한 다른 접근 방식을 고려하고 복제를 차단할 수 있습니다.


인터넷 연결이 느리기 때문에 동기화하는 데 시간이 오래 걸립니다. 특정 신호를 추천 하시겠습니까?
Anthony

@Anthony 지금 어떻게 동기화합니까?
Rabin



@Anthony 동기화 할 파일의 블록 레벨에서 작동하는 syncthing ( syncthing.net ) 또는 BTSync ( resilio.com ) 와 같은 다른 응용 프로그램을 사용해 볼 수 있습니다
Rabin

9

최대 17 시간의 동면 후에도 동기화를 쉽게 계속할 수 있다면

0 0 * * * killall -CONT -g sync.sh || /usr/local/bin/sync.sh
7 0 * * * killall -STOP -g sync.sh

동기화가 처음부터 다시 시작하는 것을 선호하는 경우

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -TERM -g sync.sh

동기화 또는 하위 작업이 신호를 무시하지만 잔해가 남지 않는 경우

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -KILL -g sync.sh

killallpsmisc


mirror -c와 함께 아래에있는 스크립트를 사용하고 있습니다. 다시 시작하지 않는 것 같습니다. 위 중 어느 것을 추천 하시겠습니까
Anthony

LFTP 스크립트가 SIGTERM이 잠금 파일을 정리하기를 원하고 17 개의 유휴 시간 또는 더 나쁜 inet [64]에서 서버 시간 초과 가능성을 고려할 때, 나는 0 0 * * * timeout 7h /usr/local/bin/sync.sh거의 비슷한 killall -TERM변형을 사용합니다.
로마 Czyborra

4

또한 cron을 사용하여 지정된 시간에 해당 서비스 또는 스크립트를 "중지"또는 "킬"합니다.
먼저 크론 작업을 작성하여 작업 또는 스크립트를 실행하십시오. (이름이있는 작업을 죽일 다른 크론을 쉽게 실행할 수 있습니다 sudo pkill wget)

둘째, 다음과 같은 결과로 유용하고 읽기 쉬운 형식으로 crontab 작업을 실행하려고합니다.

   ps -o pid,sess,cmd afx | egrep "( |/)cron( -f)?$"

첫 줄에 다음과 같이 나타납니다.

1108  1108 cron
4288  1108 \_ CRON
4289  4289     \_ /bin/sh -c /path/to/my/crontab/script1.sh
4290  4289         \_ /bin/bash /path/to/my/crontab/script1.sh
4295  4289             \_ /usr/bin/wget LINK

첫 번째 열은 PID이고 두 번째 열은 세션 ID이며 세 번째 열은 cron에서 시작한 명령입니다. 세션 ID를 사용하여 특정 크론 태스크와 관련된 모든 프로세스를 종료 할 수 있으므로 위 예에서 세션 ID 4289를 종료해야합니다.

   pkill -s 4289

pkill을 스크립트에 넣고 이것을 cron으로 실행해야합니다.


cron 작업이 실행될 때마다 세션 ID가 변경됩니까? 전원을 껐다 켜면 어떻습니까?
Anthony

예, 변경됩니다. 그러나 스크립트를 작성하면 PID를 가져 와서 변수에 넣을 수 있습니다. 표시되는 이름 만 사용할 수 있습니다. pkill sync.sh
ddlingo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.