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