Nvidia-Docker CUDA_ERROR_UNKNOWN 오류

Docker를 통해서 Nvidia GPU를 이용하기 위해서 Nvidia-Docker 를 많이 사용합니다.

컨테이너 내부에서 nvidia-smi를 통해 그래픽 카드가 보임에도 불구하고,

Tensorflow 코드를 수행하면 아래와 같은 그래픽 카드를 못찾는 다는 에러 메시지를 내보낼 때가 있습니다.

2017-06-19 08:43:18.361653: E tensorflow/stream_executor/cuda/cuda_driver.cc:406] failed call to cuInit: CUDA_ERROR_UNKNOWN
...

InvalidArgumentError (see above for traceback): Cannot assign a device for operation 'MatMul': Operation was explicitly assigned to
 /device:GPU:0 but available devices are [ /job:localhost/replica:0/task:0/cpu:0 ]. Make sure the device specification refers to a
valid device.
         [[Node: MatMul = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false, _device="/device:GPU:0"](a, b)]]

삽질 끝에 알아낸 원인은 우분투의 하이버네이션 모드에 있었습니다.

처음 부팅때는 잘 실행되지만, 하이버네이션 모드에 한번 들어갔다 나오면 재부팅 전까지는 이런 현상이 반복됩니다.

Nvidia-Docker를 이용해 그래픽 카드 사용시 참조하세요. ^^

맥에서 Jupyter 노트북으로 PySpark 사용하기

Spark

Spark 하면 먼저 클러스터를 떠올리게 되는데, 사실 로컬상에서 Spark을 이용해 프로그래밍을 하는 것도 복잡한 멀티프로세스, 멀티스레드 프로그래밍의 수고를 덜면서 로컬노드의 멀티 코어 자원을 손쉽게 활용할 수 있는 방법이기도 합니다.

맥북에 Spark을 설치하고 Jupyter를 통해 Python을 이용하여 손쉽게 Spark을 사용해 봅시다.

Read more…

2015-Docker-Proxy-Certificates-Ubuntu

Docker 사용시 네트워크에 Proxy 및 Self Signed SSL Certification 을 사용하도록 되어 있는 곳에서는 Docker Hub에서 Docker 이미지를 검색하고 내려받을때 접속 에러와 'x509: certificate signed by unknown authority' 에러를 만나게 됩니다.

이럴때는 proxy 및 SSL Certification 아래와 같이 설정합니다.

Proxy 설정

/etc/default/docker.io 파일에서 proxy 설정 후에 docker service 를 재실행합니다.

> sudo vi /etc/default/docker.io
...
export http_proxy="http://<proxy_ip>:<proxy_port>"
export https_proxy="https://<proxy_ip>:<proxy_port>"
...
> sudo service docker.io restart

SSL Certification 설정

Self Signed Certification 파일을 예를 들어 Self.crt 라고 한다면, 해당 파일을 /usr/local/share/ca-certificates 에 복사하고 update-ca-certificates 명령으로 업데이트 해줍니다.

> sudo cp ./Self.crt /usr/local/share/ca-certificates/
> sudo update-ca-certificates
> sudo service docker.io restart

2015-Many-Files-Directory-Remove-Linux

프로그래밍을 할때 실수로 디렉토리내에 많은 파일을 생성하게 하는 실수를 할 경우 해당 디렉토리가 rm -rf 명령으로 지워지지 않는 경우가 있습니다.

이럴 때는 아래와 같은 명령으로 삭제가 가능합니다.

> ls -1 -f | xargs rm

신기하게도 ls 명령도 먹통이던 디렉토리에서 위 명령은 신속하게 파일을 지워줍니다. 비결은 옵션에 있습니다. ls 명령은 내부에서 sort를 기본으로 하는데 파일이 많을 경우 이 작업에 많은 시간을 소요하게 됩니다. 이 sort 옵션을 끄게 되면 신속하게 파일이름을 가져와서 xargs 를 통해 rm 명령을 수행해 파일을 지울수 있게 됩니다.

2015-Ubuntu-fstab

우분투 머신에 하드디스크 추가 및 포맷 후 자동 마운트 설정하기

1. 하드디스크 설치

2. 부팅 후 하드디스크 확인

> sudo fdisk -l
...
Disk /dev/sdb: 512.1 GB, 512110190592 bytes
255 heads, 63 sectors/track, 62260 cylinders, total 1000215216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x88f488f4

Disk /dev/sdb doesn't contain a valid partition table
...

3. 파티션 생성

> sudo fdisk /dev/sdb
...
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-1000215215, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-1000215215, default 1000215215):
Using default value 1000215215

Command (m for help): p

Disk /dev/sdb: 512.1 GB, 512110190592 bytes
255 heads, 63 sectors/track, 62260 cylinders, total 1000215216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe8bf195f

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048  1000215215   500106584   83  Linux

Command (m for help): w
The partition table has been altered!

4. 포맷

> sudo mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (4-Feb-2014)
Discarding device blocks: done                            
Filesystem label=
OS type: Linux
...
Writing superblocks and filesystem accounting information: done

5. 마운트

uuid 확인

> sudo blkid
...
/dev/sdb1: UUID="d2eac947-9407-40bb-96cb-acd22e9a57c3" TYPE="ext4"
...

fstab 파일에 파티션 추가

> sudo vi /etc/fstab
UUID=d2eac947-9407-40bb-96cb-acd22e9a57c3 /ssd2 ext4 defaults 0 0

마운트 및 확인

> sudo mkdir /ssd2
> sudo mount -a
> df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sdb1       470G   70M  446G   1% /ssd2

2015-Ubuntu-IP-MASQUERADE

간단하게 실험용 Cluster를 구축 할때 아래와 같이 Master 서버가 Slave 서버가 외부 네트워크와 통신할 수 있도록 IP 공유기 역할을 해야 할때 IP MASQUERADE를 이용하는 방법입니다.

Internet <--> Master <--> 스위치허브 <---> Slave1,2,3 ...

Master 서버

interface 설정

Master 서버는 랜카드를 2개 가지고 있다고 가정합니다. eth0은 외부 네트워크용이고 eth1은 내부 내트워크용 랜카드 입니다.

> sudo vi /etc/network/inetrfaces

설정 파일을 열어보면 eth0은 보통 인터넷 공유기와 바로 연결되어 있어 dhcp 로 설정되어 있을 것입니다.

이제 아래와 같이 eth1 랜카드를 내부 네트워크 고정 ip 로 설정합니다.

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.10.255
gateway 192.168.0.1
dns-nameservers 8.8.8.8

설정 후 네트워크를 재시작합니다.

> sudo service networking restart

dns 서버 설정

resolvconf 서비스를 통해서 접근할 dns 서버를 설정해 줍니다.

> sudo vi /etc/resolvconf/resolv.conf.d/head

설정 파일을 열어 아래와 같이 수정합니다.

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.8.8

설정 파일 저장 후 resolvconf 서비스를 재시작합니다.

> sudo service resolvconf retart

iptables 설정

이제 Master 서버의 eth1 내부 네트워크를 통해 요청되는 패킷을 eth0 외부 네트워크카드로 전달하도록 해주는 rule 를 iptables 라는 명령어를 통해 등록해 줍니다.

> sudo /sbin/iptables -A FORWARD -o etho -j ACCEPT
> sudo /sbin/iptables -t nat -A POSTROUTING -o etho -j MASQUERADE

iptables rule 은 재부팅시에 사라지게 되므로 재부팅 시 마다 자동으로 rule 이 등록 될 수 있도록 /etc/rc.local 파일을 열어 등록해줍니다.

> sudo vi /etc/rc.local

아래와 같이 명령을 등록해 줍니다.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/sbin/iptables -A FORWARD -o eth0 -j ACCEPT
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

exit 0

Slave 서버 설정

Slave 서버의 네트워크 interface 와 dns 서버 설정은 Master 서버의 내부 네트워크 interface 설정하듯이 내부 ip로 설정해주면 됩니다.

테스트

Slave 서버에서 외부 주소로 ping 이 성공하면 성공입니다.

> ping www.google.co.kr
PING www.google.co.kr (58.123.220.104) 56(84) bytes of data.
64 bytes from 58.123.220.104: icmp_seq=1 ttl=56 time=0.859 ms
64 bytes from 58.123.220.104: icmp_seq=2 ttl=56 time=0.961 ms

2015-Ubuntu-SSH-Root-Login

Root 계정 활성화

일반 계정으로 접속뒤 아래와 같이 root 계정의 passwd 를 설정하여 계정을 활성화합니다.

> sudo passwd root

SSH 인증 설정

기본적으로 root 접속은 보안상 막혀있으므로 아래와 같이 풀어주고 SSH를 다시 실행시켜 줍니다.

> sudo vi /etc/ssh/sshd_config

...

LoginGraceTime 120
PermitRootLogin without-password
StrictModes yes
without-password를 yes로 변경하고 ssh를 다시 시작합니다.

...

> sudo service ssh restart
In [ ]:
 

2015-Ubuntu-Static-IP-Network-Setting

우분투에서 Network 를 콘솔 상에서 설정하기

interface 설정

eth0를 static IP 로 사용한다고 가정합니다.

> sudo vi /etc/network/inetrfaces

interface 파일을 열어 아래와 같이 수정합니다.

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.10.255
gateway 192.168.0.1
dns-nameservers 8.8.8.8

수정 후 networking 서비스 restart

> sudo service networking restart

dns 서버 설정

resolvconf 서비스를 통해서 접근할 dns 서버를 설정해 줍니다.

> sudo vi /etc/resolvconf/resolv.conf.d/head

설정 파일을 열어 아래와 같이 수정합니다.

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.8.8

설정 파일 저장 후 resolvconf 서비스를 재시작합니다.

> sudo service resolvconf retart

Tar를 이용한 백업

백업의 중요성은 아무리 강조해도 지나치지 않습니다. 오늘 멀쩡하던 하드가 내일은 멀쩡하리라는 보장이 없기 때문이죠.

전문적으로 백업하는 툴도 존재하지만 여기서는 백업의 정책 결정 방법 및 tar 의 스냅샷 기능을 이용한 증분백업과 cron 을 이용해 백업의 자동화하는 방법을 알아보기로하겠습니다.

백업용어

  • 풀 백업 (full backup): 자신이 백업하고자 하는 대상의 전체를 백업하는 방법
  • 증분 백업 (incremental backup): 원본 데이터와 비교하여 원본데이터에 추가되어진 데이터만 백업하는 방법

백업정책

백업에 들어가기전에 염두해두어야 할 사항들(인터넷에서 펌~)

  • 어떤 파일들을 백업할 것인가? 백업은 시스템에 어떤 위험이나 재난이 닥쳤을 때 중요한 데이터를 안전하게 보호하기 위해 하는 것이다. 어떤 데이터가 중요한지 파악하고 어떤 데이터를 백업할지 결정하는 것은 각자 시스템에 있는 데이터용도와 가변성에 따라 다를 것이다. 하지만 일반적으론 중요한 데이터베이스등 주로 가변적인 데이터를 백업하는 것에 초점을 둘 것이라 생각한다. 즉 가변성이 떨어지는 애플리케이션이나 시스템 파일들을 매일 백업할 필요는 없다는 것이다. 물론 시간과 능력이 된다면 모든 시스템 전체를 백업 받는게 가장 좋을 것이다.

  • 백업할 위치가 어디 인가? 각각의 서버에 보면 설정 파일이라든지 실시간으로 계속 생성하는 파일들의 위치를 파악하는게 중요하다.

  • 시스템 파일이 얼마나 자주 변경하는가? 시스템 파일을 자세히 살펴보면 내용이 변경되거나 생성되는 것을 볼 수 있다.

  • 누가 어디서 파일을 백업할 것인가? 시스템 관리자가 항상 시스템 앞에 있다면 계속 살펴볼면서 백업할 수 있지만 시스템 관리자당 보통 수십대씩 관리하기 때문에 현실적으로 그렇지 못하다. 보통은 시스템 관리자가 먼저 시스템 상태를 파악하 뒤 크론(cron)이 라는 작업 스테쥴러를 실행해 시스템 본체가 아닌 다른 곳에 있는 저장 매체를 택해 원격지에서 백업을 실행한다.

  • 어느 위치에 자료를 복구할 것인가? 자료복구는 백업할 때 그 파일 위치에 복구하는 게 가장 현명한 방법이다.

  • 복구할 파일을 얼마나 빠르게 복구해야 하는가? 시스템 관리자는 항상 신속 정확해야 한다. 백업 파일을 시스템에 복구할때는 많은 사용자들이 피해를 최대한 피하기 위해 신속하고 정확하게 복구를 완료해야 할 것이다.

tar 이용방법

tar

테이프 생성을 위한 유틸리티로서 바이너리 데이터를 처리할 수 있습니다. 또한 여러 디렉토리를 아카이브로 묶을 수 있으며 링크를 포함하는 디렉토리들을 전송할 수 있으면서도 파일의 소유권과 액세스 퍼미션 등도 그대로 보존할 수 있는 장점이 있습니다.

간단한 tar의 사용법( tar의 플래그) c : 아카이브 생성 x : 아카이브로 부터 파일 추출 t : 목차 테이블 보기 v : 상세한 정보 출력

$ cd /
$ tar -cf backup.tar home
$ gzip backup.tar

/home 의 하위디렉토리를 포함하여 backup.tar로 저장 하고 backup.tar.gz 이라는 파일을 생성하여 원래의 tar 아카이브보다 훨씬 더 작게 압축

$ tar -cvf - home | gzip > backup.tar.gz

을 하였을때는 tar에 따라서 v(verbose) 옵션을 stderr로 처리하지 않고 stdout으로 처리하여 문제를 일으키는 경우가 있습니다. 따라서 아카이브를 만들때는 v옵션을 빼는 것이 좋고, 아카이브를 풀때는 v 상관이 없습니다.

$ tar -tf backup.tar

아카이브를 풀기전에 항상 파일들의 이름을 먼저 검사합니다. 만일 아카이브 속의 파일들이 현재 디렉토리에 풀리도록 묶여 있다면, 임시 디렉토리를 새로 하나 만들고, 그곳으로 이동(cd)하여 파일들을 풀어냅니다.

일부 파일들만 뽑아내기

$ tar -xvf backup.tar filename
$ tar -xvf backup.tar `tar -tf backup.tar|grep filename`

여기서 filename은 tar의 t옵션으로 파일의 경로명까지 알아야 합니다. filename과 ./filename은 서로 다르므로 정확한 파일명을 지정해야 합니다.

$ tar -xvf backup.tar `tar -tf backup.tar|grep filename`

의 방법을 쓰는 것도 좋습니다.

절대 경로 문제

절대경로를 갖는 디렉토리 또는 파일을 복구할때 문제가 발생합니다. tar는 아카이브에 지정되어 있는 경로명으로 파일을 복구하기 때문에 파일이 복구될 곳을 변경할 수가 없습니다. 따라서 이미 존재하는 파일을 덮어쓰거나 퍼미션 문제가 발생할 수 있습니다.

GNU tar의 경우, 기본적으로 모든 절대 경로명을 상대경로 변경하여 아카이브를 만듭니다. --absolute-names 옵션을 사용하면 절대 경로로 아카이브를 만들게 됩니다. 가장 좋은 방법은 아카이브를 만들때 디렉토리가 슬래시(/)나 틸드(~)로 시작하지 않도록 조심하는 것입니다.

$ tar -cf backup.tar -C / .
$ tar -cf backup.tar -C /home/smiletw . -C /home/woody ./test

-C 옵션은 아카이브를 생성하기 전에 /로 이동하도록 합니다. 여러 개의 디렉토리들을 아카이브로 만들려면 -C옵션을 여러번 사용합니다.

아카이브에 추가하기

$ tar -uvf backup.tar home

새로운 파일들만 업데이트 합니다. 동일한 파일이 업데이트 되면 아카이브 마지막에 추가합니다. (테입장치에서는 중간에 넣을 수 없는 것을 감안)

GNU tar를 이용한 풀백업 및 증분 백업

일반적으로 tar를 이용해서 아카이브를 만들면 풀백업이 됩니다. 그러나 사용자 홈디렉토리 또는 한 파티션 전체를 백업할때는 풀 백업을 자주 사용하기 힘듭니다. 이럴경우 풀 백업과 함께 증분 백업을 해 주는 것이 좋다. GNU tar는 옵션 처리만으로 손쉽게 풀백업과 증분 백업이 가능하게 해줍니다. 먼저 GNU tar의 풀 백업 및 증분 백업에 쓰이는 옵션이 2가지 있습니다. -G (--incremental) 옵션과 -g snapshot-file (--listed-incremental) 입니다.

-G 옵션은 예전 증분 백업 포맷으로 아카이브를 생성해 줍니다. 이 옵션으로 생성된 아카이브에는 아카이브 내에 포함되어 있는 파일이나 디렉토리의 정보가 들어가므로 비표준 아카이브로 생성됩니다. 따라서 GNU버젼이 아닌 tar로도 내용을 볼 수가 없게 됩니다.

-g snapshot-file 옵션은 표준 아카이브로 생성되면서, 파일이나 디렉토리 등의 정보를 snapshot-file에 따로 저장함으로써, 표준 아카이브를 생성하게 만들어 줍니다.

따라서 GNU tar를 이용한 풀 백업 및 증분 백업에서는 -G 옵션이 아닌 -g snapshot-file 옵션을 사용하는 것이 좋습니다.

풀 백업

$ tar -g list -czvf backup.tar.gz home/

list 라는 snap-shot 파일이 생성됩니다. 그리고 backup.tar.gz이라는 백업된 아카이브가 생성됩니다.

증분 백업

$ tar -g list -czvf backup-1.tar.gz home/

기존의 list 파일에서 이미 풀 백업된 내용을 확인하고, 그 이후에 변경되거나 추가되거나 삭제된 파일들을 backup-1.tar.gz에 백업합니다.

GNU tar를 이용한 복구

먼저 풀 백업된 아카이브를 복구합니다.

$ tar -g list -xzvf backup.tar.gz

다음으로 증분 백업된 아카이브들 중 가장 최근에 백업한 것만 복구하면 됩니다.

$ tar -g list -xzvf backup-10.tar.gz

백업 및 복구의 유용한 옵션

-W (--verify) 검증 백업을 하는 도중 변경되는 파일이 있을 경우가 있습니다. 특히 풀 백업과 같이 시간이 오래 걸리는 백업의 경우 아카이브가 생성되는 동안 변경될 가능성이 높습니다.

따라서 풀 백업의 경우 검증해주는 것이 좋습니다.

$ tar -g list -cWf backup.tar home/

이 경우 아카이브 생성 후, 아카이브의 내용과 실제 디렉토리의 내용과 같은지 확인합니다. 그러나 gzip으로 압축하는 -z 옵션과 같이 사용할 수 없습니다.

따라서 검증 옵션을 사용해서 아카이브를 생성할 경우 gzip압축은 따로 해주어야 합니다.

백업 자동화

관리하는 서버가 별로 없다면 취미삼아 한대 한대씩 수동으로 백업해주어도 상관 없지만, 자신이 관리하는 서버가 여러대일경우 위에서 이야기한 나름대로의 백업 정책을 세워서 자동화 시켜 놓지 않는다면 백업은 불가능하게 됩니다.

여기서는 예로 서버백업정책을 설정하고 쉘 스크립트와 Cron(크론)을 이용해 자동으로 백업이 되도록 꾸며 보겠습니다.

백업 정책

  • 백업소스 디렉토리 : /home 전체 사용자가 많지 않고 /home 안에 웹및 디비 그리고 사용자정보를 모아 놓았기때문에 /home 전체를 백업하기로 결정 하였습니다.
  • 백업타겟 디렉토리 : /juvat-backup 백업본을 보관할 디렉토리로 될수 있으면 다른 파티션을 준비하고, 여유가 된다면 다른 물리적 드라이브에 저장하는 것을 추천합니다.
  • 백 업용 리모트 서버 : mirror.juvat.net 한 서버안에 모든 원본 및 백업본이 존재한다면 한번에 모든 정보를 날릴수 있으므로 FTP 를 이용해 주기적으로 리모트 서버에 백업파일을 저장합니다.
  • 백업방법 : tar 를 이용한 풀백업 및 증분백업 전체 풀 백업을 뜨면서 생성한 스냅샷 파일을 이용해 증분 백업을 하는 형식으로 백업합니다.
  • 백업주기 : /home 안의 상황이 실시간으로 중요한 정보가 없기때문에 1일을 주기로 백업하기로 하였습니다.

매월 1일에 풀 백업, 달의 나머지일은 증분 백업, 백업파일은 2개월치를 로컬 서버에 보관, 매일 백업본을 FTP로 리모트 서버에 백업

백업 쉘 스크립트 제작

예제로 실제 제작한 스크립트 소스입니다.

#!/bin/sh
#
# comafire's Backup Script
# last modify : 03.10.26
# mail : comafire@hotmail.net
#
# *.*.1 : Full Bakcup
# *.*.2~30 : Incremental Backup
# keep : 2 month
#
DATE=$(date +%y%m%d)
YY=$(date +%y)
MM=$(date +%m)
DD=$(date +%d)
BACKUPBAS=/
BACKUPSRC=./원본 디렉토리
BACKUPDST=/백업할 디렉토리
FTPBACKUPSRC=/FTP 로 보낼 원본 디렉토리
FTPBACKUPDST=받을 FTP 서버의 백업 디렉토리
FTP=IP or DomainName
FTPSCRIPT=/etc/cron.daily/BackupFtpScript
ID=Your ID
PASSWD=Your Password

case $MM in
        01) rm -f $BACKUPDST'/'$YY'11'*.*;;
        02) rm -f $BACKUPDST'/'$YY'12'*.*;;
        03) rm -f $BACKUPDST'/'$YY'01'*.*;;
        04) rm -f $BACKUPDST'/'$YY'02'*.*;;
        05) rm -f $BACKUPDST'/'$YY'03'*.*;;
        06) rm -f $BACKUPDST'/'$YY'04'*.*;;
        07) rm -f $BACKUPDST'/'$YY'05'*.*;;
        08) rm -f $BACKUPDST'/'$YY'06'*.*;;
        09) rm -f $BACKUPDST'/'$YY'07'*.*;;
        10) rm -f $BACKUPDST'/'$YY'08'*.*;;
        11) rm -f $BACKUPDST'/'$YY'09'*.*;;
        12) rm -f $BACKUPDST'/'$YY'10'*.*;;
esac
if [ $DD = "01" ]; then
        tar -g $BACKUPDST'/'$YY$MM.list -cf $BACKUPDST'/'$DATE.tar -C $BACKUPBAS $BACKUPSRC
elif [ -f $BACKUPDST'/'$YY$MM.list ]; then
        tar -g $BACKUPDST'/'$YY$MM.list -cf $BACKUPDST'/'$DATE.tar -C $BACKUPBAS $BACKUPSRC
fi
if [ -f $BACKUPDST'/'$DATE.tar ]; then
touch $FTPSCRIPT
echo user $ID $PASSWD >> $FTPSCRIPT
echo cd $FTPBACKUPDST >> $FTPSCRIPT
echo lcd $FTPBACKUPSRC >> $FTPSCRIPT
echo bin >> $FTPSCRIPT
echo prompt >> $FTPSCRIPT
echo put $DATE.tar >> $FTPSCRIPT
if [ $DD = "01" ] && [ -f $BACKUPDST'/'$YY$MM.list ]; then
        echo put $YY$MM.list >> $FTPSCRIPT
fi
echo bye >> $FTPSCRIPT
ftp -n $FTP < $FTPSCRIPT
rm -f $FTPSCRIPT
fi

여기서는 SFTP 대신 일반 FTP를 이용하였습니다. 보안을 위해서는 일반 FTP대신 SFTP 을 이용하는 것이 더욱 바람직 할 것입니다.

하지만 최소한 백업용 계정을 SSH 에서 로그인 할수 없도록 PAM 을 이용해 로그인을 제한한다면 패스워드가 누출 되더라도 백업본 자체에만 접근할 수 있기 때문에 꼭 PAM 을 이용해 백업용 계정의 콘솔 접근을 제어 할 것을 권장합니다.

In [ ]:
 

실행되고 있는 프로세스의 Core 뜨기

실행되고 있는 프로세스의 core 파일을 얻어오는 명령입니다.

core가 떠지는 동안 프로세스는 잠시 멈추었다가 수행됩니다.

사용 예는 아래와 같습니다.

dev@MP1:/home2/dev:11 % ps -ef | grep ogw
  dev  9306     1  0    4월 1 ?        0:00 ogw

dev@MP1:/home2/dev:2 % gcore -p 9306
gcore: core.9306 dumped

dev@MP1:/home2/dev:5 % gdb ~/bin/ogw ./core.9306
(gdb) bt
#0  0x7f51e590 in _poll () from /lib/libc.so.1
#1  0x7f5dd25c in poll () from /lib/libthread.so.1
#2  0x00015cec in main () at main.c:37
In [ ]: