WSL(Windows Subsystem for Linux) Ubuntu CRON Job 사용하기

CRON(Command Run On)이란, Unix System에서 제공하는 Job scheduler를 말한다. CRON은 Shell 명령어들이 주어진 일정에 주기적으로 실행하기 위해서 crontab(CRON Table)이란 것을 참조하고, crontab에는 실행시킬 Job 목록과 일정이 기록되어 있다.

CRON Table

사실, Windows에서도 Task scheduler라는 기능을 사용하면 Scheduling을 얼마든지 할 수 있긴 하다. 하지만 간혹 이미 Linux shell script로 제공되는 경우 등 Linux 환경에서의 작업이 더 유리한 상황인 경우에는 해당 script를 Windows 용으로 변경해야 하는 번거로움이 있다.

이럴때 WSL을 이용하면 좋다. WSL은 Ubuntu환경을 거의 대부분 제공하기 때문에 별도의 Linux 환경을 구성하지 않아도 주어진 Shell Script를 그대로 이용하면 Scheduling이 가능하다.

예를 들어, Linux System에 대한 Health check를 주기적으로 매시간마다 기록해야하는 상황이라고 가정해보자. Linux System이기 때문에 Bash shell script로 작업하는 것이 유리 할 것이다.

먼저, CRON Scehduler가 Backgroud에서 동작하기 위해서 daemon service를 설치 및 실행해야한다.

# Install CRON package
$ sudo apt-get udpate
$ sudo apt-get install cron

# CRON Service start
$ sudo service cron start

CRON이 정상적으로 실행되었다면, 다음으로 Health check를 위한 Script를 준비해야한다. Script는 직접 작성하여도 좋지만, 미리 잘 만들어져서 공개된 Open Source Script를 사용하면 쉽게 작업 할 수 있다.

WSL(Ubuntu-18.04)를 실행시켜 미리 잘 준비된 Script를 가져와 보자.
(Linux health check script는 여기를 참조하였다. Script code는 Apache 2.0 License로 배포되었다.)

$ wget https://tecmint.com/wp-content/scripts/tecmint_monitor.sh

Shell Script가 준비가 되었다면, WSL에서 CRON에 등록하여 사용하기만 하면 된다.
다음 명령어를 실행하면 CRON Table을 편집할 수 있는 편집창이 나온다.

$ crontab -e

아래 Command Code를 그림과 같이 편집창에 실행될 Schedule과 함께 넣어준다.

# monitor script 실행 결과를 result text 파일에 출력한다.
0 * * * * /home/newth/CRON/tecmint_monitor.sh >> /home/newth/CRON/result.txt
CRON Table 편집창

저장하고 나면 CRON Table에 Job Schedule이 등록된 것이다. 등록된 Schedule로 인해서 CRON은 매 시간 정각마다 Command에 입력된 절대경로 shell script를 실행시킬 것이다.

정상적으로 실행 되는지 확인해 보고 싶다면 다음과 같이 syslog를 확인해 보면된다.

$ tail -f /var/log/syslog

CRON Table에 등록한 대로 동작한 결과를 확인 해 볼 수 있다.

$ /var/log$ tail -f syslog

Feb 14 22:45:28 DESKTOP-LM4ALRO crontab[331]: (newth) BEGIN EDIT (newth) --CRON Table 편집 
Feb 14 22:45:33 DESKTOP-LM4ALRO crontab[331]: (newth) END EDIT (newth) --CRON Table 편집 종료
Feb 14 22:45:35 DESKTOP-LM4ALRO crontab[342]: (newth) LIST (newth) --CRON Table 리스트 확인
... 생 략 ...
Feb 14 23:00:00 DESKTOP-LM4ALRO CRON[433]: (newth) CMD (/home/newth/CRON/tecmint_monitor.sh | cat > /home/newth/CRON/result.txt) --CRON Table 실행 Log


/bin/sh^M: bad interpreter 해결 방법

Linux에서 Shell Script를 실행 할때, “/bin/sh^M: bad interpreter”라는 오류가 발생할 때가 있다. 그리고 오류 내용은 입력하지도 않은 ‘^M’이란 문자때문에 오류가 발생한 것으로 나온다.

작성한 Shell Script를 열어 내용을 아무리 살펴보아도 ‘^M’이 입력된 부분이 있다거나 잘 못 작성된 부분이 있는 것을 찾기 힘들어 엄청 열 받을 것이다.

먼저, 이 오류에 대부분의 원인에 대해서 말하자면 Windows에서 작성한 Script를 Linux에서 바로 실행 하려고 하면 나타나는 현상인데, Windows와 Linux의 개행문자를 표현 하는 방식이 다르기 때문이다.

개행문자란 무엇인가?

개행문자(혹은 Enter)는 대부분의 편집 툴에서 편집 작업시 눈에 보이지는 않지만 줄바꿈이 있을 때마다 자동으로 입력되는 문자이다. 그리고 개행문자는 앞서 언급했듯이 운영체제 별로 표현법이 다르다.

Windows에서는 CRLF(\r\n)으로 표현하는데 그 의미는 다음과 같다.

CR(Carriage Return, \r)은 새로운 행을 추가하고 LF(Line Feed, \n)는 시작위치로 돌아간다는 의미이다.

반면에, Linux에서는 LF(\n)으로만 표현하도록 되어 있다.

때문에 Windows에서 작성한 문서를 Linux에서 보면 CR이 개행문자로 인식되지 못하고 ‘^M’으로 인식 되어 버린다. 그리고 이런한 이유로 오류가 발생하게 된다.

그럼 어떻게 보이지도 않는 “^M” 문자를 처리해야 하는가?

해결법은 간단하다. VI 편집기를 사용할때 옵션 [-b]를 다음과 같이 사용하여 실행하면 바이너리 모드로 문서를 볼 수 있는데 확인해 보면 모든 줄 끝에 ‘^M’문자가 들어간 것을 확인 할 수 있다.

$ vi -b [수정 할 문서 이름]
Windows에서 작성한 문서를 Linux에서 바이너리 모드로 오픈한 화면

모든 줄마다 붙어있는 ‘^M’ 문자를 모두 삭제해 하고 다시 실행해보면 “/bin/sh^M: bad interpreter” 오류는 해결 될 것이다.

WSL(Windows Subsystem for Linux) Ubuntu GUI 환경 구성

WSL에는 기본적으로 GUI 환경을 제공하지 않는다. 대부분의 경우 터미널로 출력되는 결과물만으로도 작업하는데 별다른 문제가 없지만 간혹 GUI가 꼭 필할 때도 있다.

리눅스의 GUI환경(X-window)은 처음부터 원격실행을 고려하여 Server-Client 구조로 분리하여 설계되었다. 이러한 이유로 GUI를 제공하지 않는 WSL에서도 X-window Server-Client통신에 사용되는 X11이라는 프로토콜을 이용하면 원격으로 GUI환경을 사용할 수 있다.

X-Window 기본개념

원격지가 X-Client가 되고 원격지의 화면을 받는 곳이 X-Server가 된다. 원격지의 실행되는 GUI 프로그램이 X-Client를 통해서 X-Server에게 화면정보를 요청보내면 X-Server는 요청온 정보를 받아 화면을 그려준다.

WSL GUI 환경을 구성하기 위해서는 첫번째로 Windows 10에 X-Window Server로 동작할 Xming 서버를 설치해야 한다.

설치를 완료하고 Xming을 실행하면 시스템 트레이에서 다음과 같이 아이콘을 확인 할 수 있다.

Windows 10 System Tray

다음으로 WSL에 X-Client를 구성해야 한다. 먼저, Machine ID를 생성한다.

$ sudo systemd-machine-id-setup
$ sudo dbus-uuidgen --ensure

ID가 잘 만들어 졌는지 확인해보자.

$ cat /etc/machine-id

잘 만들어 졌다면, 이제 X-Window 패키지와 구성 요소들을 설치한다.

$ sudo apt-get install x11-apps xfonts-base xfonts-100dpi xfonts-75dpi xfonts-cyrillic

마지막으로 GUI 프로그램이 실행될때 그래픽을 출력할 수 있도록 디스플레이 환경변수를 다음과 같이 “.bashrc”에 설정 한다.

$ export DISPLAY=:0
$ source ~/.bashrc

이제 모든 준비가 되었다. WSL GUI 환경이 잘 구성 되었는지 확인하기 위해서 다음과 같이 WSL Shell에 다음과 같이 명령을 실행해 본다.

$ xeyes

잘 구성 되었다면, 다음과 같이 웃기게 생긴 눈달린 창이 나와서 마우스를 따라서 시선을 움직일 것이다.

WSL Ubuntu GUI 환경 구성

이제, WSL에서도 GUI 프로그램을 사용해 보자.

WSL(Windows Subsystem for Linux) Ubuntu Config user password

WSL(Windows Subsystem for Linux)을 사용하다 보면 user password를 잃어 버리는 경우가 있다. WSL이 아닌 경우 여러가지 복원 절차를 통해야 하지만 WSL인 경우 MS(Microsoft)에서 개발한 리눅스 호환 커털 인터페이스를 제공하기 때문에 간단히 user password를 초기화 할 수 있다.

먼저, 설치된 WSL 버전을 확인 해야 한다.
명령 실행 창에서 ‘CMD’를 실행하고 아래 명령어를 입력하면, 설치된 WSL 버전 정보를 확인 할 수 있다. (여기서는 Ubuntu 1804 Linux를 기준으로 한다.)

c:\> wslconfig /list /all

Windows Subsystem for Linux Distributions:
Ubuntu-18.04 (Default)

설치된 WSL은 Ubuntu-18.04이고, 실행 명령어는 ‘Ubuntu1804’가 된다.
(만약, Ubuntu(Default)로 나왔다면 실행 명령어는 ‘Ubuntu’가 된다.)

위에서 확인한 실행 명령어를 가지고 CMD창에서 다음과 같이 Ubuntu 기본 사용자를 root(관리자)로 변경해 준다.

c:\> Ubuntu1804 config --default-user root

이제, WSL Ubuntu를 실행하면 기본사용자가 root로 되어 있기 때문에 root로 로그인 된다.
바로, 대상 user의 password를 변경해 주고 로그아웃 한다.

$ passwd user

Enter new UNIX password: (type password)
Retype new UNIX password: (type password)

$ exit

다시 CMD창으로 돌아와 Ubuntu 기본 사용자를 기존 user로 변경해 준다.

c:\> Ubuntu1804 config --default-user user

이제, 다시 WSL Ubuntu를 실행하여 확인해 보면 password가 변경된 것을 확인 할 수 있다.