리눅스를 crontab을 이용해서 필요한 시기에 자동으로 명령을 실행할 수 있다.
crontab을 사용하려면 편집을 통해 명령을 등록해야 되는데, 편집을 하려면 아래와 같이 한다.
$ crontab -e
crontab은 사용자별로 각각 등록할 수 있으므로 시스템 관련 명령을 사용하려면 root 사용자로 편집을 해야된다. 이를 위해 아래와 같이 한다.
$ sudo crontab -e
crontab의 명령은 아래와 같은 방법으로 입력한다.
.---------------- minute (0 - 59)
| .------------- hour (0 - 23)
| | .---------- day of month (1 - 31)
| | | .------- month (1 - 12) OR jan,feb,mar,apr ...
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | |
* * * * * command to be executed
위의 예시에서 별이 5개 있는데, 첫 번째 별부터 의미를 살펴보면…
- 분 – 0부터 59의 값을 가진다.
- 시 – 0부터 23의 값을 가진다.
- 일 – 1부터 31의 값을 가진다.
- 월 – 1부터 12의 값을 가진다.
- 요일 – 0부터 6의 값을 가지며, 일요일이 0, 토요일이 6이다.
- 명령 – 실행할 명령을 적는다.
예를 들어 매주 월요일 3시 30분에 재부팅을 하게 하려면 편집기에서 아래와 같이 입력한다.
30 3 * * 1 /sbin/shutdown -r now
편집을 다 했으면 <ctrl>-<x>를 누른 후 <y>를 누르면 편집한 내용이 저장되고 편집기를 마친다.
crontab에 등록된 명령 목록을 확인하려면 아래와 같이 한다. 필요하면 앞에 sudo를 붙인다.
$ crontab -l
마지막으로 아래와 같이 해서 cron 서비스를 다시 시작한다.
$ service cron restart
cron 서비스가 동작하는지 확인하려면 다음과 같이 한다.
$ service cron status
동작중이면 아래와 같이 표시된다.
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2024-03-12 21:47:51 KST; 3s ago
Docs: man:cron(8)
Main PID: 1090 (cron)
Tasks: 1 (limit: 1116)
Memory: 444.0K
CGroup: /system.slice/cron.service
└─1090 /usr/sbin/cron -f
Mar 12 21:47:51 ShrimpServer systemd[1]: Started Regular background program processing daemon.
Mar 12 21:47:51 ShrimpServer cron[1090]: (CRON) INFO (pidfile fd = 3)
Mar 12 21:47:51 ShrimpServer cron[1090]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
cron이 동작하지 않는다면…
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Tue 2024-03-12 21:47:39 KST; 2s ago
Docs: man:cron(8)
Process: 625 ExecStart=/usr/sbin/cron -f $EXTRA_OPTS (code=killed, signal=TERM)
Main PID: 625 (code=killed, signal=TERM)
Mar 12 21:44:11 ShrimpServer systemd[1]: Started Regular background program processing daemon.
Mar 12 21:44:11 ShrimpServer cron[625]: (CRON) INFO (pidfile fd = 3)
Mar 12 21:44:12 ShrimpServer cron[625]: (CRON) INFO (Running @reboot jobs)
Mar 12 21:47:39 ShrimpServer systemd[1]: Stopping Regular background program processing daemon...
Mar 12 21:47:39 ShrimpServer systemd[1]: cron.service: Succeeded.
Mar 12 21:47:39 ShrimpServer systemd[1]: Stopped Regular background program processing daemon.
리눅스에서 crontab을 이용한 자동화
30 3 * * 1 reboot
위와 같이 했더니 재부팅 명령이 동작하지 않았다.
메시지가 Skipping @reboot jobs — not system startup라고 나오는 걸 보면,
재부팅 시 명령을 실행하라는 것으로 이해하는 것 같다. 즉 @reboot로 이해하는 듯.
30 3 * * 1 /sbin/shutdown -r now
이렇게 바꿨더니 잘 동작하는 걸 보면
30 3 * * 1 /sbin/reboot
로 하면 잘 될 것으로 보인다.