본문 바로가기
LinuX

Cron

by 타마마임팩트_쫀 2008. 11. 24.

[Cron] Unix, Linux

 

주기적인 프로그램 수행 : cron 시설  [ 04/05/27 03:18 ]

cron주기적으로 프로그램을 수행할 수 있게 해주는 유닉스 시설이다.

crontab 파일
보통 : /var/spool/cron/crontabs / FreeBSD : /var/cron/tabs, /etc/crontab
리눅스 : /var/spool/cron(레드햇) / /var/spool/cron/tabs(수세)
/etc/crontab(레드햇,수세)


crontab 형식
보통 : 시스템 V (사용자 필드가 없음)
BSD : /etc/crontab(사용자 이름이 6번째 필드여야 함)


cron.allow, cron.deny 파일
보통 : /var/adm/cron / FreeBSD : /var/cron
리눅스 : /etc(레드햇) , /var/spool/cron(수세)
솔라리스 : /etc/cron.d


관련기능
보통 : 없음 / FreeBSD : periodic 유틸리티
리눅스 : /etc/cron.*(houry, daily, weekly, monthly)
레드햇 : anacron 유틸리티


cron 로그 파일
보통 : /var/adm/cron/log / FreeBSD : /var/log/cron
리눅스 : /var/log/cron / 솔라리스 : /var/cron/log


crond의 pid 가 기록되어 있는 파일
보통 : 없음 / FreeBSD : /var/run/cron.pid
리눅스 : /var/run/crond.pid(레드햇), /var/run/cron.pid(수세)


cron을 시작하는 부팅 스크립트
FreeBSD : /etc/rc / HP-UX : /sbin/init.d/cron
리눅스 : /etc/init.d/cron / 솔라리스 :/etc/init.d/cron


부팅 스크립트 설정 파일 cron 관련 엔트리
FreeBSD : /etc/rc.conf / cron_enable="YES",cron_flags="args-to-cron"
HP-UX : /etc/rc.config.d/cron (CRON=1) / 리눅스 : 사용하지 않음
솔라리스 : /etc/default/cron (CRONLOG=yes)


 

crontab 파일

무엇을 실행하고 언제 실행할지 여부를 결정하는 파일, cron 스케줄.

*시스템 V 방식 에서 사용자는 기본적으로 crontab 엔트리는 사용자마다 /var/spool/cron/crontabs/사용자명 디렉토리에 저장된다.
예) /var/spool/cron/crontabs/root

* BSD 방식은 전통적으로 /etc/crontab 파일 하나만 사용한다.
*FreeBSD,리눅스 시스템은 파일도 사용하고 디렉토리도 사용한다.

crontab 파일은 직접적인 편집보다 crontab 명령어를 이용하여 생성 수정한다.

crontab 파일의 엔트리
 
                |-----------------------------------------------|
                | 필드  |   표기되는 대상   |    사용가능한 값       |
                |-----------------------------------------------|
                | 필드1 |             분            |         0 - 59, *         |
                | 필드2 |            시간          |         0 - 23, *         |
                | 필드3 |             일            |         1 - 31, *         |
                | 필드4 |             월            |         1 - 12, *         |
                | 필드5 |            요일          | 0 - 6 (0=sunday), * |
                | 필드6 | 명령(행의 끝까지) |                             |
                |-----------------------------------------------|


minutes hours day-of-month weekday command
  
1.각필드는 공백으로 구분하고 요일후에는 모든것을 명령어로 취급하므로 공백이 포함될수 있다.
2.필드에는 단일 숫자, 숫자-숫자(범위) , 쉼표로 분리한 단일숫자 또는 범위 목록, 애스터리크 사용가능
3. 첫문자가 # 일경우 주석처리
4. 명령어에 퍼센트기호(%)가 있으면 기호 이후에 나타나는 텍스트를 표준 입력으로 사용한다. 이후에 나타나는 퍼센트 기호는 텍스트를 여러행으로 분리하는 데 사용한다.
  예) 30 11 31 12 * /usr/bin/wall%Hppy New Year!%Let's make it treat!
5. 요일과 날짜는 OR 처리된다고 생각할수 있다.
  예) * * 1 1 1 /usr/local/bin/test55 (1월1일 과 매 월요일에 실행된다)
<참고> BSD 시스템에서는 여섯 번째 필드는 명령어를 실행할 사용자 계정이고 요일도 달라서 월요일이 1이고 일요일이 7이다
  예) 0 3 * * 6-7 root /var/adm/weekend.sh


FreeBSD, 리눅스 crontab 엔트리 형식 향상점
1. 월과 요일은 처음 세글자로 줄여 지정가능 (예, mon, jan, feb....)
2. 일요일을 0과 7모두 사용 가능
3. 범위 목록을 동시에 사용가는 (예, 2,4,6-7) -> HP-UX에서도 가능함
4. /n 을 통해 주기를 지정할수 있다.
   (예) 시를 8-18/2 -> 8시부터18시까지 2시간마다
      분을 */5 5분마다
5. crontab 파일에서 본 셸 형식으로 환경 변수 정의 가능
   (예) MAILTO=kenauros
6. FreeBSD 시스템에서는 스케쥴 필드 대신 특수 문자열을 사용할수 있다
    @reboot
    @yearly    1월1일 자정
    @monthly 매달 1일 자정
    @weekly 매주 일요일 자정
    @daily 자정
    @hourly 매시간 0분


crontab 엔트리 추가 하기
$crontab mycron
/var/spool/cron/crontabs/유저명 에 mycron 파일 생성

$crontab -l
crontab 엔트리 보기

$crontab -r
crontab 엔트리 제거

$crontab -e
직접 crontab 파일을 변경

#crontab -e adm
루트가 adm 의 crontab 엔트리 변경
FreeBSD,리눅스 에서는 -u 를 통해 사용자를 지정가능
#crontab -e -u adm


cron 보안 문제

cron.allow 파일이 존재할경우 사용자 이름이 있어야만 crontab을 실행할수 있다
cron.allow 파일은 없지만 cron.deny가 있으면 cron.deny 에 없는 사람만 crontab

명령어를 사용할수 있다. cron.deny가 빈파일이면 아누나 cron 기능을 사용할수 있다.
두 파일 모두 없으면 루트만 하용할수 있다.(리눅스 , FreeBSD 에서는 두파일 모두 없으면

아무나 사용할수 있다.)

 

 

[Cron] Solaris, HP, AIX

 

[Solaris]
솔라리스에서는 crondtab -e하면 않되네요..
어떻게 해야 편집되요?

EDITOR=vi
export EDITOR

 

[HP]

$ crontab -e
crontab: you are not authorized to use cron.  Sorry.
$ crontab -l
crontab: you are not authorized to use cron.  Sorry.

 

#vi /var/adm/cron/cron.allow


# ps -ef | grep cron
    root  1132     1  0  Mar 31  ?         0:00 /usr/sbin/cron
    root 10570 10174  0 09:50:09 pts/tc    0:00 grep cron
#cd /sbin/init.d

# ./cron stop
cron stopped
# ps -ef | grep cron
    root 10579 10174  0 09:50:33 pts/tc    0:00 grep cron
# ./cron start
cron started
#

 

[AIX]

# more /etc/inittab

cron:23456789:respawn:/usr/sbin/cron

...

 

http://unix.co.kr/data/irix/?p=11

inittab: script for the init process
형식: id:level:action:process
기능: 
 id : 유일한 두개 또는 하나의 문자.
 level: (0~6, s, S)
level이 빈란이면 action은 모든 level들에대하여 가능.
 action :  어떤 행동을 취해야 하 는지를 알고있는 스크립를 실행.
action의 종류는
sysinit int가 시스템 콘솔을 다루기를 시도하기전에 수행해야할 활동을 해라.
respawn 프로세스를 시작하고, 이것이 죽으면 자동으로 재 시작해라.
wait 프로세스를 시작하고, 이 실행 상태를 위한 다음 에트리로 가기 전에 , 끝날때까지 기다려라.
boot  단지 부팅시에만 에트리를 시작한다.
powerfail init가  power fail 신호를 받았을때 실행 해라.
bootwait 이것은 시스템이 부팅된후 single-user에서 multi-user 상태로 갈때 실행된다.
off 이것은 무시해라.
initdefault 디폴트 실행 단계를 지정해라. 일반적으로 2혹은 3으로 정해라.
once 이미 실행하고 있지않으면 프로세스를 시작한다.
bcheckrc root file system을 준비한다.
brc /etc/fstab을 체크해서 모든 파일 시스템을 마운트 시켜라.
rc0 shutdown level script
rc2 multiuser level script
uadmin 시스템 종료를 초기화하는 명령어.
 process :This is a sh command to be executed. 
예;
is:2:initdefault:
fs::sysinit:/etc/bcheckrc </dev/console >/dev/console 2>&1 
mt::sysinit:/etc/brc </dev/console >/dev/console 2>&1 
link::wait:/etc/lnsyscon > /dev/console 2>&1 < /dev/null 
s0:06s:wait:/etc/rc0 >/dev/console 2>&1 </dev/console 
s1:1:wait:/etc/shutdown -y -iS -g0 >/dev/console 2>&1 </dev/console 
s2:23:wait:/etc/rc2 >/dev/console 2>&1 </dev/console 
s3:3:wait:/etc/rc3 >/dev/console 2>&1 </dev/console 
s4:06:wait:/etc/umountfs > /dev/console 2>&1 
of:0:wait:/etc/uadmin 2 0 >/dev/console 2>&1 </dev/console 
RB:6:wait:/etc/init.d/announce restart 
rb:6:wait:/etc/uadmin 2 1 >/dev/console 2>&1 </dev/console 


# on-board ports or on Challenge/Onyx MP machines, first IO4 board ports 
t1:23:respawn:/sbin/getty ttyd1 co_9600         # alt console 
t2:23:off:/sbin/getty -N ttyd2 co_9600          # port 2 
t3:23:off:/sbin/getty -N ttyd3 co_9600          # port 3 
t4:23:off:/sbin/getty -N ttyd4 co_9600          # port 4 
 

option:
 
 SEE ALSO 
     getty(1M), init(1M), sh(1), who(1), exec(2), open(2), signal(2). 
 

 

변경 ..

cron:23456789:wait:/usr/sbin/cron

 

재부팅 후..

#ps -ef | grep cron

#kill -9 ??

#/usr/sbin/cron start &

 

 

stopsrc [-h host] [-f | -c] -s subsystem_name

startsrc [-h host] [-e environment] [-a argument] -s subsystem_name

#stopsrc -s sendmail


 

 

[Cron][Log] SecureOS & Cron_Shellscript

 

SecureOS & Shellscript
#vi shellscript.pl

#/bin/bash
chmod 777 /root/testdir/testfile
cat /root/testdir/testfile

#./shellscript.pl
번호 서버 시간 접속IP목적IP 사용자 프로세스 대상 접근형태 대응방법 롤 인증서비스 터미널 시스템콜 
1 WOW7.3 08-11 01:18 192.168.22.1   (102 : root : 0) chmod (3610,47421) /root/testdir ACTL : W DENY Test_shellscript    chmod 
2 WOW7.3 08-11 01:18 192.168.22.1   (102 : root : 0) cat (3611,47459) /root/testdir ACTL : R DENY Test_shellscript  pts/1 open 
----------------------------------------------------------------------------------------

SecureOS & Cron

crontab -e 명령어를 통해서 예약작업을 설정하면..
/var/spool/cron/사용자명 파일로 저장됩니다.

$ crontab -l
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * cat /root/testdir/procfile
# crontab -l
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * cat /root/testdir/testfile

번호 서버 시간 접속IP목적IP 사용자 프로세스 대상 접근형태 대응방법 롤 인증서비스 터미널 시스템콜 
1 WOW7.3  08-11 01:41 0.0.0.0   (-1 : a : 102)         cat (1382,47459) /root/testdir ACTL : R ACPT Test_shellscript  notty open 
2 WOW7.3  08-11 01:41 0.0.0.0   (-1 : root : 0) cat (1381,47459) /root/testdir ACTL : R ACPT Test_shellscript  notty open 
----------------------------------------------------------------------------------------

SecureOS & Cron+Shellscript

# crontab -l
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * /root/HZ_Test/shellscript.pl

번호 서버 시간 접속IP목적IP 사용자 프로세스 대상 접근형태 대응방법 롤 인증서비스 터미널 시스템콜 
1 WOW7.3  08-11 01:53 0.0.0.0   (-1 : root : 0) chmod (1309,47421) /root/testdir ACTL : W ACPT Test_shellscript  notty chmod 
2 WOW7.3  08-11 01:53 0.0.0.0   (-1 : root : 0) cat (1310,47459) /root/testdir ACTL : R ACPT Test_shellscript  notty open 

 

 

목적 :

Cron을 사용하면서 luid=-1값을 가지고 cp, sh 등의 프로세스를 가지고 /var/adm에 접근하는 문제를 해결하도록 모색해 본다.

 

테스트 환경 :

Linux, Solaris, HP, AIX에 대해 테스트 하였습니다.

 

테스트 내용 :

시스템이 부팅된 후 Cron을 설정하면 다음과 같이 luid=-1 이 나옵니다.

17 03-22 09:35 155 0.0.0.0   (-1 : root : 0) abc.sh (8606,313631) /opt/XXXXX ACTL : X DENY .XXXXX tty/255   
18 03-22 09:35 155 0.0.0.0   (-1 : jhlee : 100) user.sh (8612,313631) /opt/XXXXX ACTL : X DENY .XXXXX tty/255 

 

root의 사용자로 로긴한 후 root 사용자가 Cron을 재시작하면 다음과 같이 luid=0 이 나옵니다.

19 03-22 09:38 155 0.0.0.0   (0 : root : 0) abc.sh (8652,313631) /opt/XXXXX ACTL : X DENY .XXXXX tty/255   
20 03-22 09:38 155 0.0.0.0   (0 : jhlee : 100) user.sh (8657,313631) /opt/XXXXX ACTL : X DENY .XXXXX tty/255 

 

(단 AIX만이 프로세스 명이 abc.sh이라고 나오지 않고 sh로 나왔습니다.)

 

결론 :

Cron을 사용하게 되면서 /var/adm 의 디렉토리에 cp, sh .. 등의 프로세스를 설정해 주어야 했는데..

Cron을 root가 재시작하고 정책에 관리자로서 root를 포함하여 위의 문제를 우회할 수 있을것 같습니다.

[출처] Cron|작성자 maniacat


'LinuX' 카테고리의 다른 글

klogin과 rlogin  (0) 2009.06.08
linux 파티션 나누기  (0) 2009.05.08
USB 휴대용 저장 장치 마운트  (0) 2008.09.08
linux make law device(리눅스 raw device 생성)  (0) 2008.09.04
dpkg와 apt 사용하기  (0) 2008.01.08