Tips in Action‎ > ‎기타‎ > ‎

웹호스팅 서버에서 crontab이 불가하다? - 원격 crontab

전종필

웹호스팅을 하는 서버에서는 대개 crontab을 지원해 주지 않습니다. 왜냐하면, 많은 사용자들이 저마다 crontab을 하게되면, 시스템 리소스를 많이 잡아먹게 되지요. 잘못 만들어져서 영원한 LOOP에 빠지는 프로그램을 crontab에 걸어두면, 매번 작업을 할 때마다 새로운 프로세스가 생기지만 프로그램이 끝나지 않기 때문에 시스템에는 엄청난 프로세스가 떠있게 되고, 결국은 웹서비스도 제대로 되지 않기 때문입니다.
혹은, 웹서버가 윈도우즈 계열이라면, 기본적으로 telnet으로 로그인하는 사람이 crontab과 유사한 서비스를 받기는 어렵겠지요.

이 것을 피해서 정확한 시간마다 어떤 작업을 하도록 하는 방법이 있긴 있습니다. 다만, 스스로 생각해서 꼭 필요한 경우에만 하도록 해야겠지요.
이 것을 하려면 crontab을 지원하는 또 다른 서버에 접근할 수 있어야 합니다. 그 것은 아마도, 학교의 서버이거나, 직장의 서버일 수 있겠지요. 그리고 그 서버에는 perl이 있어야 하고, LWP::Simple 모듈이 설치되어 있어야 합니다.

일단 하고자 하는 작업을 웹서버에 CGI로 만듭니다. 그 CGI를 Perl로 만들던, php로 만들던 그 것은 상관없습니다. (하지만, 이 곳이 Perl.or.kr인 만큼 Perl로 하시도록 권하겠습니다. :-) 그 프로그램의 URL이 웹서버의 로그를 분석해서 데이터베이스로 저장하는 http://your.hostname.com/cgi-bin/parselog.cgi라고 가정하겠습니다. crontab을 지원하는 여러분의 또 다른 서버로 일단 로그인 하십시오. 그리고 crontab -e를 실행하여 다음 줄을 추가 합니다. (시간 간격 지정은 여러분의 필요에 따라 다르겠지요. 여기서는 parselog.cgi라는 이름에 걸맞게 매일 새벽 3시쯤에 하는 것으로 하겠습니다.


0 3 * * * perl -MLWP::Simple -e "get('http://your.hostname.com/cgi-bin/parselog.cgi')"
간단하죠?
물론, perl이 아닌 다른 것으로 할 수도 있겠지만, 그 것은 여기서 거론할 순 없겠죠.
-M 옵션은 perl 스크립트의 use와 같습니다. 즉 -MLWP::Simple은

use LWP::Simple;
과 같습니다.
그리고 -e 옵션은 다음에 주어지는 인수를 파일 이름이 아닌 스크립트로 알고 실행하라는 뜻입니다. 그래서 perl -MLWP::Simple -e "get('http://your.hostname.com/cgi-bin/parselog.cgi')" 는 스크립트

#!/usr/bin/perl
use LWP::Simple;
get('http://your.hostname.com/cgi-bin/parselog.cgi');
과 같은 의미입니다. (참고, 스크립트의 맨 끝이나 블록( {...} )의 맨 끝에는 ;를 붙이지 않아도 됩니다)
get은 LWP::Simple 모듈에 구현되어 있는 것으로, 주어진 URL을 연결하여 얻은 내용을 반환합니다. 결국 http://your.hostname.com/cgi-bin/parselog.cgi에 주어진 내용을 매일 새벽 3시에 실행하여 주는 것이지요.

몇가지 전재조건이 있어야 하긴 하지만, 아마 대의는 이해를 하셨으리라고 봅니다. 다시한번 말씀 드리지만, 꼭 필요할 때에만 사용하시기 바랍니다

Comments