재부팅하면 안에 있는 파일들이 삭제 된다. 재부팅을 하지 않아도 정기적으로 10일마다 삭제
- /var/tmp란?
재부팅을 해도 파일들이 삭제되지 않는다. 정기적으로 30일마다 삭제
[root@localhost ~]# cat /usr/lib/tmpfiles.d/tmp.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# See tmpfiles.d(5) for details
# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d
# Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp
CentOS6까지는 /etc/cron.daily/tmpwatch 라는 스크립트가 위 디렉터리에 있는 파일들을 삭제하는데, CentOS7부터는 tmpwatch를 대신해 systemd-tmpfiles가 동작한다.
systemd-tmpfiles의 설정 파일은 /usr/lib/tmpfiles.d/tmp.conf에 위치한다.
참고로 systemd-tmpfiles-clean.service 서비스에 의해서 파일이 삭제된다.
* 더 자세히 알고 싶으면 메뉴얼 페이지를 보자
[root@abc/tmp]# man tmpwatch
[root@abc/tmp]# vi /etc/cron.daily/tmpwatch
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
-X '/tmp/hsperfdata_*' -X '/tmp/.hdb*lock' -X '/tmp/.sapstartsrv*.log' \
-X '/tmp/pymp-*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
if [ -d "$d" ]; then
/usr/sbin/tmpwatch "$flags" -f 30d "$d"
fi
done
위와 같이 매일 한 번씩, atime/mtime/ctime 기준으로 10일 이상된 파일을 삭제하는 것으로 보이며, /var/tmp 의 경우는 보관기간이 30일로 더 긴 것으로 나온다.
cron.allow와 cron.deny 파일이 둘 다 존재하지 않는 경우, 루트 사용자 권한이 있는 사람만 crontab명령으로 작업할 수 있다.
cron.allow 및 cron.deny 파일을 편집하거나 만들려면 수퍼유저(root) 권한이 필요하다.
crontab 생성, 편집, 표시, 제거 가능
crontab 생성, 편집, 표시, 제거 불가능
cron.allow (O)
cron.allow에 나열된 사용자만
나머지
cron.allw (X) cron.deny (O)
cron.deny에 나열된 사용자를 제외한 모든 사용자
cron.deny에 나열된 사용자
cron.allow (X) cron.deny (X)
슈퍼유저 권한 필요(ex. root)
슈퍼유저 제외 나머지 모두
root계정으로 cron.allow 수정하여 해당 계정 추가(한 라인에 사용자 이름 하나씩)
- crontab 파일 권한 여부 확인 방법
#해당 사용자계정으로 로그인
crontab -l
crontab: can't open your crontab file
-> 1) crontab 파일 존재하는지 확인 필요 2) crontab 파일 권한 확인 필요
crontab: you are not authorized to use cron. Sorry.
-> 1) cron.allow 파일에 사용자 이름 등록 필요
- Crontab 사용 팁
1. 한 줄에 하나의 명령만 쓰자
# 잘못된 예
* * * 5 5
/home/script/test.sh
# 잘된 예
* * * 5 5 /home/script/test.sh
2. 필요할 때 주석을 달자
# 주석 #
#--------------------#
# 이것은 주석입니다. #
#--------------------#
3. 로그(log) 남겨두자
# 덮어쓰기
* * * * * /home/script/test.sh > /home/script/test.sh.log 2>&1
# 기존의 test.sh.log에 이어서 쓰기
* * * * * /home/script/test.sh >> /home/script/test.sh.log 2>&1
# 로그 확인
vi /home/script/test.sh.log
4. 주기적으로 백업하자
혹시라도 crontab -r 를 쓰거나 실수로 crontab 디렉토리를 날려버려서 기존 크론 내역들이 날아갔을 때를 방지하여 주기적으로 크론탭을 백업하자.
# 크론탭 내용을 txt 파일로 만들어 저장
crontab -l > /home/bak/crontab_bak.txt
# 크론탭 내용을 txt 파일로 만들어 저장 (자동화)
50 23 * * * crontab -l > /home/bak/crontab_bak.txt
- Crontab 사용 시 주의할 점
crontab의 규칙에 맞게 설정을 했음에도 불구하고 동작하는 않은 경우가 발생한다. 보통 아래의 이유 때문이다.
1. 환경변수
SHELL
등록된 작업을 실행시킨 쉘을 지정한다**(크론탭은 실행시에 별도로 쉘을 띄운다)**. 지정하지 않을시 기본값으로 /bin/sh로 지정된다.
PATH
쉘을 별도로 띄워서 실행하는 특성때문에, 쉘에서 프로그램을 찾기위한 PATH도 별도로 지정해줄 필요가 있다.
# 매분마다 sample.sh을 실행하며 프로그램이 작동할 쉘과 경로를 지정해준다.
crontab -e
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
* * * * * sample.sh
2. 권한문제
vi /etc/crontab을 통해 크론탭을 직접 수정을 했을 경우 root 권한 명령을 실행하려면 root권한을 명시해 주어야 한다.
crontab -e
* * * * * example.sh
# 두 번째 처럼 root 권한을 명시해야 한다.
vi /etc/crontab
* * * * * root example.sh
3. 절대경로 / 상대경로
절대경로로 작성하여 나중에 생길 오류를 방지하자.
즉, /usr/local/bin/php74를 실행 시에는 php74 보다는 /usr/local/bin/php74로 절대 경로로 명시
at명령어 프로그램을 사용하면 일회성의 프로세스(명령어) 실행 예약을 매우 간단하게 할 수 있다.
$ at [옵션] 시간
지정한 시간에 원하는 명령을 실행할 수 있다. 간단한 알림 메시지부터 복잡한 스크립트 등
예약된 작업은 /var/spool/at 디렉터리에 개별 파일로 저장된다.
실행 결과는 /usr/sbin/sendmail을 통해 메일로 전송된다.
/etc/at.allow와 /etc/at.deny 환경설정 파일을 통해 at 명령어에 대한 접근제어가 가능하다.
- at 옵션
옵션
설명
-V
버전을 보여준다.
-q (queue)
queue 이름을 지정한다.
-f 파일명
스크립트 파일 등을 실행해 줄 때 사용한다.
-m
작업이 완료될 때 사용자에게 메일을 보낸다.
-M
메일 보내기 않기
- t [[CC]YY]MMDDhhmm[.ss]
[[CC]YY]MMDDhhmm[.ss]로 시간 지정
-l
예약된 작업 목록을 보여준다.
- r
예약된 작업을 삭제한다.(unix)
-d
예약된 작업을 삭제한다.(linux)
TIME
실행할 시간을 기록한다. 기본적으로 "hh:mm YYYY-MM-DD"로 적는다. hh:mm은 시간으로 24시간제를 기본으로 한다.
TIME 시간대는 hh:mm yyyy-mm-dd (시간:분 연도-월-날짜)의 형식이나 now+값 (minutes/hours/days)로 현재 시간 +(분/시간/일) 단위로 설정할 수 있다.
# : 2019년 12월 25일 21시 30분에 명령어 실행
at 21:30 2019-12-25
# : 현재 시간 5분 뒤에 명령어 실행
at now+5 minutes
- atq
현재 예약된 작업 목록을 확인하는 명령어. at -l 과 동일
qa@qa-VirtualBox:~$ atq
1 Wed Feb 9 20:00:00 202 a qa
# atq 출력 포맷
<job number> <date> <hour> <queue> <user-name>
대기 큐에서 대기 중인 작업들의 목록을 확인할 수 있다.
슈퍼 유저(root)인 경우에는 모든 유저의 대기 중인 작업이 출력되고, 그 외에는 로그인된 사용자의 작업이 출력된다.
작업을 설정할 때 큐를 설정할 수 있고, 'a-z'의 큐가 존재하며 'a'에 가까울 수록 우선순위가 높다. 큐를 설정하지 않으면 'a'가 기본이다.
- atrm
예약된 작업을 삭제. at -d 옵션과 동일
- batch
시스템에 부하를 주지 않도록 실행한다.
- at 사용법
at 명령어는 시간 정보는 필수로 입력해야 하고, 그 외의 정보는 옵션이다.
at 시간 명령어를 입력하고 실행한다.
그러면 at**>** 표준 입력을 할 수 있는 프롬프트 창이 나온다. 예약시간대에 이행할 명령어를 입력한다.
입력을 마치면 [Ctrl]+[D]로 종료(EOT, End Of Transmission) 하면 된다.
이렇게 하면 지정한 시간대에 해당 명령어가 실행하게 된다.
예시
# 내일 23시 00분에 yum update를 진행하라
[root@localhost backup]# at 23:00 tomorrow
at> yum -y update
at> reboot
# 그 후, Ctrl + D 클릭
at> <EOT>
job 1 at Sun Dec 27 23:00:00 2020
[root@localhost backup]#
# 23:01 분에 git을 설치하라는 명령어를 하나더 추가했더니, job2로 저장이 된다.
[root@localhost backup]# at 23:01 tomorrow
at> yum install git
at> reboot
# 그 후, Ctrl + D 클릭
at> <EOT>
job 2 at Sun Dec 27 23:01:00 2020
[root@localhost backup]#
예약된 리스트 확인
[root@localhost backup]# at -l
1 Sun Dec 27 23:00:00 2020 a root
2 Sun Dec 27 23:01:01 2020 a root
[root@localhost backup]#
예약 작업 제거
[root@localhost backup]# atrm 2
1 Sun Dec 27 23:00:00 2020 a root
[root@localhost backup]#
- at 사용자 접근제어
at 명령어는 기본적으로 root 사용자만 사용할수 있다.
단, /etc/at.allow와 /etc/at.deny 두 파일을 이용해 일반 사용자의 사용 권한을 지정해 줄 수 있다.