일반적으로 자바 프로세스를 확인하려면, ps 또는 jps를 사용한다. 


$ ps -e | grep java

$ jps



중요한 내용만 보고 싶다면, jps -ml을 사용하여 알 수 있다. 



$ jps -ml | grep 4822

4822 google.server.Server  --http.port=8001




프로세스(process) 이름을 길게 얻으려면 다양한 방밥이 있는데, 간단하게 (efw) 옵션을 주거나 /proc/밑의 cmdline으로 알 수 있다. 


$ ps -efw | grep java

$ cat /proc/${PID}/cmdline



하지만, 너무 classpath가 너무 많아서 command line이 너무 길면 결국 얻어올 수 없다. (커널레벨의 제한이 있다)



command line을 ps또는 /proc/${PID}/cmdline에서 볼 수 있도록 하려면, http://stackoverflow.com/questions/199130/how-do-i-increase-the-proc-pid-cmdline-4096-byte-limit의 내용처럼 PAGE_SIZE를 수정하고 컴파일해야 한다고 한다. 



centos 6,7(kernel 3.12전)에서 적용된 base.c 소스

http://lxr.free-electrons.com/source/fs/proc/base.c?v=2.4.37



하지만, 리눅스 커널 4.2가 설치된 버전에서는 완전한 커맨드를 사용할 수 있다. 

- proc: fix PAGE_SIZE limit of /proc/$PID/cmdline (Alexey Dobriyan) 

https://patchwork.kernel.org/patch/6191541/

http://www.serverphorums.com/read.php?12,1179056

http://lxr.free-electrons.com/source/fs/proc/base.c?v=4.2






* 참고로, 일부 centos 버전에서는 모두 볼 수 있다.

최근에 장비에 2.6.32-642.11.1el6.centos.plus 버전이 깔려 있는데, ps 커맨드 실행시 프로세스 이름을 한 줄로 보여주고 있다. 


$ uname -r

2.6.32-642.11.1.el6.centos.plus.x86_64



http://centos.yourname.nl/centos/6/centosplus/Source/SPackages/에서

http://centos.yourname.nl/centos/6/centosplus/Source/SPackages/kernel-2.6.32-642.11.1.el6.centos.plus.src.rpm를 다운받아 확인한다. 


rpm 를 설치한다. 


$ sudo rpm -ivh kernel-2.6.32-642.11.1.el6.centos.plus.src.rpm



rpmbuild 디렉토리에 SOURCES와 SPECS가 존재한다.  kernel.spec 파일에 패치된 내용이 존재한다. 


./SPECS/kernel.spec:- [fs] proc: fix PAGE_SIZE limit of /proc/$PID/cmdline (Jarod Wilson) [1100069]



커널 소스를 풀어본다. 


$ rpm2cpio kernel-2.6.32-642.11.1.el6.centos.plus.src.rpm | cpio -idmv 


$ tar xvf linux-2.6.32-642.11.1.el6.tar.bz2


$ cd  linux-2.6.32-642.11.1.el6


$ vi ./fs/proc/base.c



바뀐 내용을 확인할 수 있다.



* 소스


다운받은 소스 또는 http://lxr.free-electrons.com/source/fs/proc/base.c?v=4.2#L199를 참조한다.


특별히 볼 소스는 다음과 같다. 

include/linux/mm_types.h에 있는 mm_struct과 base.c를 살펴보면, 프로세스 영역으로 들어가 

 매개변수가 들어가는 공간을 확인한다(len1, len2)

code & data 영역(access_remote_vm)에 들어갈 공간에 데이터가 없다면, 최대 PAGE_SIZE안의 데이터를 매개변수로 받는다. (아마도 PAGE_SIZE보다 작은 매개변수 값들) code 영역에 들어간 공간 정도로 엄청 긴 것은 계속 code &data 영역에서 계속 매개변수를 읽도록 한다. 결국은 매개변수를 다 채워서 리턴하는 코드이다. 








Posted by '김용환'
,



오랜 시간동안 사용 중인 git 프로젝트에는 정리하지 않은 branch(hotfix, feature, branch)이 존재한다. 


이를 삭제하려면 2개의 과정이 필요하다.




1) 로컬 내부 저장소 깨끗이 정리하기


바로 삭제하려면, 아래와 같이 에러가 발생할 수 있다. 

error: unable to delete 'aaa' remote ref does not exist

error: failed to push some refs to 'aa'



$ git fetch -p origin



2) 리모트 저장소 저장하기


hotfix 만 삭제하고 싶다면, 다음과 같이 실행한다. 


$ git branch -r | grep hotfix | cut -d"/" -f2-  | xargs git push origin --delete



만약 다른 feature도 함께 삭제하고 싶다면, 다음과 같이 실행한다. 


$ git branch -r | grep -E '(feature,hotfix)' | cut -d"/" -f2-  | xargs git push origin --delete


Posted by '김용환'
,


centos 5에서 설치시 rpm is not signed이라는 에러가 발생했다.


$ sudo yum install abc.rpm

Package abc.rpm is not signed



centos 5.8에서 rpm을 지우려면 /etc/yum.conf에서 작업을 진행해야 한다. 


$ cat /etc/yum.conf

gpgcheck=1


gpgcheck의 값을 1로 변경한다.


$ sudo vi /etc/yum.conf

gpgcheck=0




설치는 이상없이 잘 작동된다. 

$ sudo yum install abc.rpm

Posted by '김용환'
,


capistrano에서 서버 팜에 대해 console 커맨드를 실행할 수 있다. 


http://capistranorb.com/documentation/advanced-features/console/


레시피 파일에 간단히 추가하면 된다. 


require 'capistrano/console'



이제 실행해보자. 

$ cap alpha console
..
capistrano console - enter command to execute on alpha
alpha> 



아래와 같이 코드를 실행하면 다음과 같다. 


alpha>  echo $(hostname && uname -r )


abc.google.com 2.6.32-431.el6.x86_64





Posted by '김용환'
,



telegraf에서 mongodb 모니터링를 지원한다.


https://github.com/influxdata/telegraf/tree/master/plugins/inputs/mongodb


이전에 알아야 할 내용은 http://knight76.tistory.com/entry/grafana(먼저 influxDB, grafana, telegraf를 설치한다.)를 참조한다.




$ cd /etc/telegraf


$ sudo sh -c 'telegraf -sample-config -input-filter mongodb -output-filter influxdb > telegraf.conf'




$ sudo vi /etc/telegraf/telegraf.conf


  urls = ["http://monitir.google.io:8086"] # required

  database = "mongodb" # required




테스트하고 정상적인지 확인한다.


$ telegraf -config telegraf.conf -input-filter mongodb -test

* Plugin: inputs.mongodb, Collection 1



telegraf 데몬을 시작한다. 


$ sudo service telegraf start








Posted by '김용환'
,



최근 redis(3.2 이상 아니면 3.0 이상)부터 redis 프로세스의 설정 파일이 보이지 않는다. 



redis 2.x에서는 실행한 후 ps 커맨드로 확인하면 다음처럼 볼 수 있는데.. (설정 파일 기반)


/usr/local/redis/src/redis-server /etc/redis/6379.conf



redis 3.x(3.0 아니면 3.2부터는 정확히는 기억 안남)동일한 커맨드를 써도 이제는 설정의 내용을 기반으로 보여준다.

(처음에는 내가 잘못 실행한 줄 알고 깜짝 놀랐음.)



/usr/local/redis/src/redis-server *:6379


/usr/local/redis/src/redis-server 0.0.0.0:6379





Posted by '김용환'
,



mongo db 3.2-> mongo db 3.4 migration 설명이다. 

이미 wiredTiger 버전을 사용 중이라 큰 이슈가 없지만, 

cenots 부분에서는 조금 mongo 3.4 부터 centos 6과  7 버전으로 나누어지지, 잘 유의해서 설치해야 한다. 

(참고로 centos6 관점에서 mongdb 3.2는 70M인 반면, mongodb 3.4는 100M이다)


https://docs.mongodb.com/manual/administration/install-enterprise-linux/




새로 추가된 mongodb 3.4의 기능은 다음과 같다. 


https://docs.mongodb.com/manual/release-notes/3.4/




slave에서 먼저 셧다운한다. 


$ mongo


MongoDB shell version: 3.2.10

connecting to: test

replset:SECONDARY> use admin

switched to db admin

replset:SECONDARY> db.shutdownServer()

server should be down...



binary를 교체한다. 재시작하기 전에 /etc/mongodb.conf 설정 파일을 수정한다. 



cd /usr/local

sudo wget ..mongodb-linux-x86_64-rhel62-3.4.1.tgz

sudo tar zxvf mongodb-linux-x86_64-rhel62-3.4.1.tgz

sudo rm mongodb-linux-x86_64-rhel62-3.4.1.tgz

sudo chown www:www mongodb-linux-x86_64-rhel62-3.4.1

sudo rm mongodb

sudo ln -sf  mongodb-linux-x86_64-rhel62-3.4.1 mongodb




다음에 mongodb를 실행한다.


/usr/local/mongodb/bin/mongod -f /etc/mongod.conf



아래와 같은 문구가 mongo 경고가 발생하지만, 큰 문제 아니다. xfs를 써야 좋아진다거나 acl을 쓰라는 경고이다. 


** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine

 **          See http://dochub.mongodb.org/core/prodnotes-filesystem


** WARNING: Access control is not enabled for the database.

Read and write access to data and configuration is unrestricted.




mongo 3.4에서 다음 커맨드를 실행한다.


use admin

db.runCommand( { replSetGetStatus : 1 } )




레플리카 저오를 포함하는 optimes가 새로 추가되었다. 

(https://docs.mongodb.com/manual/reference/command/replSetGetStatus/)


"optimes" : {

"lastCommittedOpTime" : {

"ts" : Timestamp(1483325059, 2),

"t" : NumberLong(-1)

},

"appliedOpTime" : Timestamp(1483325059, 2),

"durableOpTime" : Timestamp(1483325059, 2)

},





동기화가 잘 완료되었는지 명확히 알기는 어렵지만, rs.status() 결과에 slave에 아래 heartbit 관련 필드가 포함되어 있다면 동기화가 완료된 것으로 생각하고 있다.(자세한 것은 소스보며 추후 살펴 볼 예정이다)


optimeDurableDate

lastHeartbeat

lastHeartbeatRecv





Posted by '김용환'
,