script를 단독으로 실행하면 echo 가 출력되는데 왜 

crond 로 script를 돌리면 화면에 echo가 출력이 안되는 이유는 ?


- crond 라는 데몬은 터미널에서 분리되어 있기 때문이다.


# vim rsyncbackup.sh 

-- rsyncbackup.sh --

#!/bin/sh


# /backup/0414

#          |

#          +-- etc

#          |

#          +-- home

#          |

#          +-- ...


today=$( date +%Y%m%d )


if [ ! -d /backup/$today ] 

then

   mkdir -m 700 -p /backup/$today

fi


for dir in  etc home

do

  echo "-- /${dir} backup start --"

  rsync -az /${dir} /backup/$today

  echo "-- /${dir} backup stop --"

done

-- rsyncbackup.sh --



# ps aux | grep crond

root     27767  0.0  0.4   3336  1196 ?        Ss   08:20   0:00 crond

root     27938  0.0  0.2   5144   708 pts/0    R+   09:11   0:00 grep crond


# ls -l /proc/27767/fd

합계 0

lrwx------ 1 root root 64  4월 14 12:43 0 -> /dev/null    <-- 이 부분을 주목

lrwx------ 1 root root 64  4월 14 12:43 1 -> /dev/null    <-- 이 부분을 주목

lrwx------ 1 root root 64  4월 14 12:43 2 -> /dev/null    <-- 이 부분을 주목

lrwx------ 1 root root 64  4월 14 12:43 3 -> /var/run/crond.pid

lrwx------ 1 root root 64  4월 14 12:43 4 -> socket:[91580]



# tty

/dev/pts/0

# ps

  PID TTY          TIME CMD

27853 pts/0    00:00:00 bash

27943 pts/0    00:00:00 ps

# ls -l /proc/27853/fd

합계 0

lrwx------ 1 root root 64  4월 14 12:55 0 -> /dev/pts/0

lrwx------ 1 root root 64  4월 15 09:12 1 -> /dev/pts/0

lrwx------ 1 root root 64  4월 15 09:11 2 -> /dev/pts/0

lrwx------ 1 root root 64  4월 15 09:12 255 -> /dev/pts/0



# cat /etc/crontab 

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/


# run-parts

01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly



# 시간날짜   사용자 명령어

30 04 * * * root /root/bin/rsyncbackup.sh




# vi a.c

You have new mail in /var/spool/mail/root

# cat a.c 

-- a.c --

#include <stdio.h>

#include <unistd.h>


int main()

{

  sleep(50);

  return 0;

}

-- a.c --



# gcc -o a a.c

# ./a &

[1] 27990

# ls -l /proc/27990/fd

total 0

lrwx------ 1 root root 64 Apr 16 04:32 0 -> /dev/pts/0

lrwx------ 1 root root 64 Apr 16 04:32 1 -> /dev/pts/0

lrwx------ 1 root root 64 Apr 16 04:32 2 -> /dev/pts/0

# tty

/dev/pts/0


--> 쉘에서 실행하면 자신의 터미널로 출력 방향이 정해짐


# vi a.c 

-- a.c --

#include <stdio.h>

#include <unistd.h>


int main()

{

  //sleep(50);

  printf("Hello World \n");

  return 0;

}

-- a.c --



# gcc -o a a.c

# ./a

Hello World 




# vi a.c 

-- a.c --

#include <stdio.h>

#include <unistd.h>


int main()

{

  close(1);

  sleep(50);

  //printf("Hello World \n");

  return 0;

}

-- a.c --



# gcc -o a a.c

# ./a&

[1] 28016

# ls -l /proc/28016/fd

total 0

lrwx------ 1 root root 64 Apr 16 04:38 0 -> /dev/pts/0

lrwx------ 1 root root 64 Apr 16 04:38 2 -> /dev/pts/0




# vi a.c 

-- a.c --

#include <stdio.h>

#include <unistd.h>


int main()

{

  close(1);

  //sleep(50);

  printf("Hello World \n");

  return 0;

}

-- a.c --



# gcc -o a a.c

# ./a           <-- 화면에 출력이 안된다. 왜 ? stdout를 close 했기 때문에




# rm -f /etc/cron.allow 

# su - user1

$ crontab -e 

* * * * *  date >> /tmp/user1.txt

$ crontab  -l

* * * * *  date >> /tmp/user1.txt

$ exit



# su - user2

$ crontab -e 

* * * * *  date >> /tmp/user2.txt

$ crontab  -l

$ exit



- 사용자크론이 등록되는 디렉토리

# ls -ld /var/spool/cron (일반유저가 접근할 수 없다)

drwx------ 2 root root 4096  4월 11 13:55 /var/spool/cron/

# ls -l /usr/bin/crontab 

-rwsr-sr-x 1 root root 309932  2월 23  2012 /usr/bin/crontab*


# ls -l /var/spool/cron/  

-rw------- 1 user1    root 34  4월 11 13:53 user1

-rw------- 1 user2    root 34  4월 11 13:55 user2




- 확인

# tail /tmp/user1.txt 

Fri Apr 11 13:54:01 KST 2014

Fri Apr 11 13:55:01 KST 2014

Fri Apr 11 13:56:02 KST 2014

Fri Apr 11 13:57:01 KST 2014

# tail /tmp/user2.txt 

Fri Apr 11 13:56:02 KST 2014

Fri Apr 11 13:57:01 KST 2014



- 일반유저의 cron을 삭제

# crontab -r -u user1

# ls /var/spool/cron

user2   <-- user1 파일이 삭제



# crontab -r -u user2

# ls /var/spool/cron

<-- user2 파일이 삭제



- cron 과 관련된 파일들

# rpm -ql vixie-cron

/etc/cron.d

/etc/pam.d/crond

/etc/rc.d/init.d/crond

/etc/sysconfig/crond

/usr/bin/crontab

/usr/sbin/crond

/usr/share/man/man1/crontab.1.gz

/usr/share/man/man5/crontab.5.gz

/usr/share/man/man8/cron.8.gz

/usr/share/man/man8/crond.8.gz

/var/spool/cron



# rpm -ql crontabs

/etc/cron.daily

/etc/cron.hourly

/etc/cron.monthly

/etc/cron.weekly

/etc/crontab

/usr/bin/run-parts