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가 변경된 것을 확인 할 수 있다.

서버 백업 / 복원하기

백업하기

전체 백업을 하기위해서 우선 루트 디렉토리로 간다.

$ cd /

tar을 이용해서 전체 백업을 한다.

$ sudo tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --one-file-system /

혹시 빼주고 싶은 파일이나 폴더가 있다면 exclude에 넣어주면된다.

--exclude=/[제외 폴더]

백업이 완료되면 루트 디렉토리 (/)에 backup.tar.gz이라는 파일을 볼 수 있다.
USB같은 외부 저장장치에 잘 보관해 두면 된다.

복구하기

루트 디렉토리에서 백업을 했기때문에 복구 할때도 루트 디렉토리에서 한다.

$ cd /

백업을 해두었던 tar파일을 압축을 풀어 복구한다.

$ tar xvpfz backup.tar.gz -C /

**앞에서 루트(/)디렉토리로 옮겨가라고 했지만 -C / 옵션을 사용한다면 다른곳에 저장되어 있어도 상관없다.

백업에서 제외햇던 디렉토리는 직접 만들어 준후 재부팅을 하면 복구가 완료된다.

$ reboot

추가 옵션 설명

​-z 압축 백업자료를 gzip을 이용하여 압축한다.
-c 생성 새로운 저장 파일을 만든다.
-v 수다 백업이 되고 잇는 파일 목록을 보여준다.
-p 퍼미션 보존 파일 보호를 위한 정보는 복구할 수 있도록 기억해 둔다.

Ubuntu에서 nvidia 그래픽 카드 드라이버 설치하는 방법

로그인 부팅하고 최초 로그인 화면에서 화면이 멈추다 깨지거나 로그인을 하고 x-window로드중에 시스템이 멈춰서 사용이 불가능 하는 경우, 그래픽 드라이버가 제대로 설치가 안된 것이다.

로그인 화면이 뜨는 순간 바로 Crtl + Alt + f1~6을 빠르게 눌러서 터미널 창에 접속한다.

(* 우분투도 2013년 4월25일 이후의 업데이트부터는 저장소에서 기본으로 지원합니다.)
그 다음 nvidia-current 패키지를 설치 하면 된다.

$ sudo apt-get install nvidia-current

재부팅을 하고 로그인을 하면 정상적으로 GUI환경에서 사용하실 수 있다.

USB 드라이브로 Ubuntu 설치 시 부팅이 되지 않을 때

USB로 우분투를 설치하는 경우, 부트로더에서 USB로 부팅을 하면 커서만 깜빡이고 진행이 멈춰버리는 증상이 나타날 때가 있다.

  1. USB이미지를 http://www.ubuntu.com에서 제공하는 툴로 설치 usb를 만든다.
  2. 윈도우 콘솔(cmd)을 띄운 후 diskpart를 입력하면 실행이 된다.
  3. list disk 명령어를 입력하면 현재 사용되고 있는 디스크 목록이 나온다.
  4. 목록 중 select disk #no 입력해서 우분투 설치 USB드라이브를 선택 한다.
  5. list partition 명령어를 입력하면 선택한 드라이브의 파티션 목록이 나온다.
  6. 목록 중 select parition #no 입력해서 설치 로더가 있는 파티션을 선택한다.
  7. active를 입력하고 list partition #no 하면 파티션 이름 앞에 *가 붙는다.
    (디스크 파티션이 활성화 되었다.)

다시 재부팅해서 USB로 부팅하면 설치가 잘 된다.

Can’t ssh localhost

ssh localhost를 하였을때, Read from socket failed: Connection reset by peer 라는 메시지가 튀어 나오면서 접속이 안되는 경우가 있다.

이경우 ssh_config파일을 죽어라 재설정 해도 잘 되지 않는다.
일단, 이 메시지가 나오면 포트를 확인해본다.

$ lsof -i:22

현재 LISTEN 상태인지 다른 프로세스하고 ESTABILISHED 되어 있는지 확인한다. 상태가 LISTEN이 아니거나 아무것도 안나오면 서버가 실행되지 않은것이고 다른 프로세스하고 ESTABILISHED되어있으면 해당 프로세스를 과감히 kill 해준다.

하지만

sshd    2750 root    3r  IPv4  15134      0t0  TCP *:ssh (LISTEN)
sshd    2750 root    4u  IPv6  15136      0t0  TCP *:ssh (LISTEN)

이런식으로 나올경우 서버 자체는 정상 작동하고 다른 프로세스하고는 연관이 없다. 그냥 재설치 하자.

재설치를 그냥 reinstall 옵션을 사용해도 좋지만 서버의 경우 설정파일이 그냥 남아 있는 경우가 있으므로, 제일 먼저 설정파일을 관리자 권한으로 모조리 삭제 해준다.

$ sudo rm /etc/ssh/sshd_config

그 다음은 purge 옵션으로 서버를 삭제 해주고 재설치를 하면 된다.

$ sudo apt-get purge openssh-server
$ sudo apt-get install openssh-server

이제 마지막으로 재부팅을 한후에 다시 실행하면 잘 접속 될 것이다.

Swap메모리 추가하기

메모리가 부족할 경우 시스템이 멈추거나 장애가 생긴다.
Ubuntu의 경우 Bus error이라는 메시지가 나오는 경우 보통 메모리 문제인데
이경우 Swap 메모리를 늘려주면 해결된다.

1. Swap 메모리를 늘리기 위해서는 root유저로 로그인 해야한다.

$ su - OR $ sudo -s

2. Swap메모리로 사용될 가상 파일을 생성해준다.

$ dd if=/dev/zero of=/swapfile bs=1024 count=3145728
#(**여기서 3145728는 1024*1024*3으로 나온것이며 3GB를 나타낸다**)

그러면 약 2~3분후 다음과 같이 결과가 나온다.

3145728+0 records in
3145728+0 records out
3221225472 bytes (3.2 GB) copied, 504.698 s, 6.4 MB/s

3. 만들어진 Swap 파일을 리눅스에서 사용할수 있는 메모리 형태로 만들어 주어야 한다.

$ mkswap /swapfile

그러면 Swap 메모리가 만들어진다.

Setting up swapspace version 1, size = 3145724 KiB
no label, UUID=cb9b919d-dfa9-406f-99e3-9717b7c96b51

4. 이제 만들어진 Swap 파일을 Swap 메모리 영역에 올려주면 된다.

$ swapon /swapfile

5. free명령어로 확인하면 가상메모리 (Swap)영역이 증가한 것을 확인 할 수있다.

         total      used    free    shared      buffers  cached
Mem:    738540    731124    7416         0         5828  371416
-/+ buffers/cache:353880  384660
Swap:  3145724         0 3145724