[ruby] enumeration의 inject

Ruby 2016. 8. 12. 21:58


inject 함수를 배웠다. inject() 의 내부 매개변수는 초기화 값이다. 

간단한게 배열에 대한 값을 쉽게 계산할 수 있다. 


$ irb



[3,6,9].inject() { | sum, element | sum += element  }

=> 18



[3,6,9].inject(10) { | sum, element | sum += element  }

=> 28










Posted by '김용환'
,



Jenkins에서 아래와 같이 job이 실행이 안되고, 계속 기다려야 하는 상황이 있을 수 있다.


(대기열—Waiting for next available executor on worker) 





아마도 화면에서는 이렇게 보일 것이다.





화면에서 추측할 수 있듯이 프로세스 executor 개수 설정에 따라 executor 상태 정보를 볼 수 있다.






jenkins 노드 설정에 # of executors 값이 1 로 설정되어 있다.(화면의 항목은 실행할 수 있는 job executor를 표현한 것이다) 이 값을 큰 값으로 정의한다.


큰 값(예, 20)으로 정의하면, 위 화면에서 3 번째 노드처럼 20개의 executor를 볼 수 있다.









Posted by '김용환'
,





jenkins(1.583)에서 Job 구성시 Build 섹션에서 MultiJob Phase 에서 여러 job을 추가할 수 있다. 

만약 Multijob 실행 중 하나에서 문제가 발생하면, job에서는 다음과 같은 에러가 발생하고, 더 이상 job 실행이 되지 않는다.



<문제 발생한 job 로그>


Build step 'Execute shell' marked build as failure

Finished: FAILURE




<문제 job 때문에 같이 에러가 발생하는 job 로그>


Aborted by anonymous 

jenkins Finished: ABORTED




이 문제를 해결하는 과정을 공유한다.


- Job의 Kill the Phase on 옵션에 Never 를 선택한다.

- Abort all other job이 실행되지 않도록 한다.






이렇게 설정해도  문제가 발생할 수 있다. 




그럴 때는 장비에 접근해서 자바 데몬(slave)이 잘 떠 있는지 확인한다.

보니, slave 데몬이 동시에 두 개가 떠 있다면, 문제 해결의 실마리가 있는 지 확인할 수 있다.


$ ps -ef | grep java

www   11282 11227  0 19:10 pts/0    00:00:00 grep --color=auto java

www   24960 24711  0 16:47 ?        00:00:00 bash -c cd "/var/lib/jenkins" && java  -jar slave.jar

www   24961 24710  0 16:47 ?        00:00:00 bash -c cd "/var/lib/jenkins" && java  -jar slave.jar

www   25002 24960  0 16:47 ?        00:00:31 java -jar slave.jar

www   25003 24961  0 16:47 ?        00:00:36 java -jar slave.jar





아마도 장비 설정을 잘못한 경우이다. 


- jenkins 노드 설정시, 한번 slave agent를 실행한 상태라면, 기존 장비로 연결되어 있다. 따라서, '연결끊기'를 한후, 다시 '연결' 버튼을 누르고, launch slave agent 버튼을 클릭하여 jenkins slave 데몬이 정상적으로 실행될 수 있다. 



Multi job을 실행하는 장비에서 slave데몬이 아래처럼 필요한 데몬만 뜨도록 설정되어 있는지 ps 명령어로 확인한다.



$ ps -ef | grep java

deploy   12347 12225  0 19:22 ?        00:00:00 bash -c cd "/var/lib/jenkins" && java  -jar slave.jar

deploy   12368 12347  8 19:22 ?        00:00:05 java -jar slave.jar

deploy   12985  4801  0 19:23 pts/0    00:00:00 grep --color=auto java


    

이제 더 이상 aborted 에러 메시지를 발생하지 않는다.



Posted by '김용환'
,



ssh 연결시 다음 에러가 발생했다.


Host key verification failed.



ssh 인증시. 에러가 발생했고, 이를 해결하기 위해 ssh -v를 실행했다. 로그가 자세히 출력되고 힌트를 얻을 수 있다.



debug1: read_passphrase: can't open /dev/tty: No such device or address

Host key verification failed.




ssh -o StrictHostKeyChecking=no 추가하면 문제 없이 로그인할 수 있다. 





Posted by '김용환'
,

yum 캐시 데이터로 인해서 잘못된 동작이 일어날 수 있다. 이럴 때, yum의 캐시를 정리할 수 있다.



캐시된 패키지 정보를 모두 삭제하는 커맨드이다.


$ sudo yum clean packages



캐시된 XML 기반의 메타데이터를 삭제한다.


$ sudo yum clean metadata



캐시된 모든 데이터베이스 파일을 삭제한다.


$ sudo yum clean dbcache



사용하지 않는 불필요한 디스크 공간을 정리하고, 동시에 이전 커맨드와 같이 캐시된 모든 파일을 삭제한다.


$ sudo yum clean all



다음 커맨드를 실행하여 yum 캐시를 재구성한다.


$ sudo yum makecache



Posted by '김용환'
,



저널 로그를 보려면 다음과 같다. 센트OS 7의 시스템 서비스의 대부분은 저널 로그에 저장된다.


$ sudo journalctl



기간별 검색이 가능하다.


$ sudo journalctl --since "2016-08-06 00:00:00" --until "2016-08-10 10:30:00"

-- Logs begin at 금 2016-08-05 00:17:04 KST, end at 월 2016-08-08 11:34:27 KST. --

 8월 06 00:00:01 kara070 CROND[12476]:




어제부터 sshd.service 로그를 보고 싶다.


$ sudo journalctl -u sshd.service --since "yesterday"

-- Logs begin at 금 2016-08-05 00:17:04 KST, end at 월 2016-08-08 11:35:02 KST. --

...





에러 타입에 대한 저널 로그를 살펴본다.


$ sudo journalctl -p err -b



상세로그를 보려면 다음을 실행한다.


$ sudo journalctl -p err -b -o verbose



상세로그를 tail -f 처럼 보고 싶을 때 다음처럼 실행한다.


$ sudo journalctl -f




참고로, 도커 설정 파일에도 다음과 같은이 저널 로그를 설정되어 있다.


OPTIONS='--selinux-enabled --log-driver=journald'



Posted by '김용환'
,


로그인 이후에 환경 메시지를 설명하려면 /etc/motd 파일을 사용한다.


$ sudo vi /etc/motd

# welcome knight76


로그아웃하고 다시 연결하면 배너가 출력된다.


$ ssh ..

# welcome knight76



ssh 로그인할 때만 추가하려면 /etc/ssh/sshd_config 를 수정해서 주석처리된 Banner 옵션을 수정해서  가르키는 파일을 만든다. 



$ sudo vi /etc/ssh/sshd_config

...

# no default banner path

#Banner none

Banner /etc/mybanner

...




ssh 로그인에 사용할 새로운 배너 파일을 생성한다.


$ sudo vi /etc/mybanner

######### ssh test ########





sshd 서비스를 재시작한다. 


$ sudo systemctl restart sshd.service



로그아웃하고 로그인하면 다음과 같은 화면이 뜬다.


$ ssh ..
######### ssh test ########

vagrant@localhost's password:





배너를 동적 스크립트로 쓰려면 /etc/profile.d/motd.sh를 수정해서 사용한다.


$ sudo vi  /etc/profile.d/motd.sh
#!/bin/bash
echo -e "`hostname`에 오신 것을 환영합니다. 계정: `whoami`, kernerl 정보 : `uname -r`"


로그아웃하고 다시 접근하면 다음 내용을 볼 수 있다.

$ 로그인
######### ssh test ########
vagrant@localhost's password:
Last login: Fri Aug  5 03:43:48 2016 from 10.0.2.2
# welcome knight76
knight76에 오신 것을 환영합니다. 계정: vagrant,  kernerl 정보 : 3.10.0-327.22.2.el7.x86_64




Posted by '김용환'
,


시간을 동기화하기 위해 과거에는 ntpd 데몬을 사용했지만, 이제는 좀 더 좋은 chrony를 사용할 수 있다.


먼저 chrony 패키지를 설치한다.


$ sudo yum install -y chrony


패키지는 chrony이지만, 실행 데몬 이름은 chronyd이다. 먼저 상태를 보면, 아직 실행 중은 아니다.


$ sudo systemctl status chronyd

● chronyd.service - NTP client/server

   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)

   Active: inactive (dead)

   

   


chronyd를 실행한다.


$ sudo systemctl start chronyd



chronyd 상태를 확인한다.


$ sudo systemctl status chronyd

● chronyd.service - NTP client/server

   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)

   Active: active (running) since 금 2016-08-05 01:55:27 UTC; 1s ago

...


 systemd[1]: Started NTP client/server.

 

   


부팅 이후에도 실행되도록 설정한다.


$ sudo systemctl enable chronyd




timedatectl 커맨드로 시간 정보를 확인하고, NTP 동기되어 있는지 확인한다. 


$  timedatectl status

      Local time: 시간

  Universal time: 시간

        RTC time: 시간

       Time zone: UTC (UTC, +0000)

     NTP enabled: no

NTP synchronized: yes

 RTC in local TZ: no

      DST active: n/a

      



$ timedatectl  | grep "NTP synchronized"

NTP synchronized: yes




만약 NTP synchronized: no라면 다음 명령어를 사용한다.


$ sudo timedatectl set-ntp yes




chrony가 시간 동기화를 제대로 진행하고 있는지 확인한다.


$ chronyc tracking

Reference ID    : IP정보

Stratum         : 3

Ref time (UTC)  :시간정보

System time     : 0.004222759 seconds slow of NTP time

Last offset     : -0.005224241 seconds

RMS offset      : 0.005224241 seconds

Frequency       : 41.940 ppm fast

Residual freq   : -6.715 ppm

Skew            : 0.610 ppm

Root delay      : 0.050698 seconds

Root dispersion : 0.028846 seconds

Update interval : 65.3 seconds

Leap status     : Normal





chrony가 동기화에 사용되는 네트워크를 확인한다.


$ chronyc sources

210 Number of sources = 4

MS Name/IP address         Stratum Poll Reach LastRx Last sample

===============================================================================

^- 3.3.3.3        2   6    37    60    -11ms[  -11ms] +/-  103ms

^* 11.1.2.1               2   6    37    60   -218us[-5442us] +/-   54ms

^- 1.3.2.1               3   6    37    60    -27ms[  -27ms] +/-  339ms

^- 4.5.6.7       2   6    37    60  -4180us[-4180us] +/-  115ms

Posted by '김용환'
,


센트OS7을 설치하면 기본 로케일 설정과 키맵 설정은 미국으로 되어 있다.


localectl을 사용해서 로케일 상태 정보를 확인할 수 있다.


$ localectl status

   System Locale: LANG=en_US.UTF-8

       VC Keymap: us

      X11 Layout: us



한국 설정으로 바꿔본다.


$ sudo localectl set-locale LANG=ko_KR.utf8

$ sudo localectl set-keymap ko-mac


localectl을 사용해서 변경된 로케일 상태 정보를 확인할 수 있다.


$ localectl status

   System Locale: LANG=ko_KR.utf8

       VC Keymap: ko-mac

      X11 Layout: us



이제, 에러 메시지가 한글로 출력된다.


$ ls /adsfa/

ls: cannot access /adsfa/: 그런 파일이나 디렉터리가 없습니다




Posted by '김용환'
,



메모리에 블루투스 모듈을 로딩했는지 lsmod로 확인한다.


$ lsmod | grep btusb


블루투스 모듈이 있는지 확인한다. kernerl/drivers/bluetooth 디렉토레 있는지 확인할 수 있다.


$ modinfo btusb

filename:       /lib/modules/3.10.0-327.22.2.el7.x86_64/kernel/drivers/bluetooth/btusb.ko

license:        GPL

version:        0.6

description:    Generic Bluetooth USB driver ver 0.6

author:         Marcel Holtmann <marcel@holtmann.org>

rhelversion:    7.2

..



modprobe를 이용해서 블루투스 모듈을 메모리에 올린다.


$ sudo modprobe btusb




정상적으로 블루투스 모듈이 올라갔는지 lsmod로 확인한다.


$ lsmod | grep btusb

btusb                  28219  0

bluetooth             372944  1 btusb



이제 블루투스 모듈을 내리고, 메모리에 해당 모듈이 있는지 확인한다.


$ sudo rmmod btusb


$  lsmod | grep btusb


Posted by '김용환'
,