한 개의 터미널에서 여러 화면을 사용해야 할 때 screen은 매우 유용합니다. 백그라운드로 돌려야 하는 작업도 " > /dev/null 2>&1 " 같은 꼬리표보다 가끔은 screen이 편할 때도 있죠. 이번 글에서는 screen을 빠르게 사용하기 위한 기본 커맨드를 알아봅니다. # screen 실행 screen -S sockname screen은 이름을 갖습니다. 이름으로 구분해서 스크린을 사용할 수 있죠. 보통 여러 개의 스크린을 운영할 일은 드물기 때문에 적당히 본인만의 이름을 사용해도 크게 무리는 없습니다. 여기서는 sockname을 이름으로 사용했습니다. # screen 빠져나오기 Ctrl + a + d 스크린을 빠져나올 때는 위의 커맨드를 순서대로 눌러주면 됩니다. 마치 영어를 AD를 입력할..
Ubuntu 16.04에서 Audacity를 사용하던 도중에 어떤 이유로 시스템을 재부팅 했는데 (OS crash로 인해), 부팅이 된 후로는 Audacity가 실행이 안됐습니다. 실행시켜보면 아래와 같은 팝업만 노출이 되었구요. 아마도 프로그램이 실행될 때 대부분의 애플리케이션이 그러듯이 pid 파일을 저장해둘 것 이라고 생각했는데요. 관련해서 보통의 애플리케이션은 pid를 /var/run/ 디렉터리 밑에 저장하도록 처리를 합니다. 하지만 Audacity 관련해서는 찾을 수가 없었습니다. 조금 더 찾아보니 아래 경로에 lock 파일이 있었네요. /var/tmp/audacity-{USER}/audacity-lock-{USER} 해당 파일을 삭제하고 Audacity가 정상적으로 동작되는 것을 확인했습니다...
conda를 사용하면서 activate와 deactivate를 타이핑하는 것이 왜 이리 힘들던지, 그리고 환경을 이동하는 것이 어찌나 불편했는지 모릅니다. 그래서 dialog를 이용해서 아래와 같은 툴을 만들어서 사용하기도 했습니다. 예를 들어 터미널에서. conda라는 명령어를 타이핑하면 바로 위의 dialog가 나옵니다. 그리고 환경을 선택해서 사용했었네요. 소스코드는 아래 링크에서 확인하실 수 있습니다. https://github.com/jybaek/conda_connector 주로 이런 방식으로 사용해오다가 다른 git, docker와 같은 일반적인 명령어들처럼 tab을 이용해서 자동 완성하는 게 더 고급져 보이지 않을까 하는 생각을 하게 됩니다. 그래서 bash_completion을 만들게 되었..
https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md 평소 vim을 즐겨 쓰고 있는데 회사 동료가 vim 패치를 하셔야 하지 않냐며 링크를 던져주셨습니다. 링크에 취약점 내용을 살펴보니 1) 공격자는 nc(netcat)을 통해 포트를 열고 있고 2) 공격자가 배포한 특수 파일을 보통의 사람이 vim으로 열었을 때 3) 파일에 감춰져있는 코드가 동작. nc로 shell을 실행시켜 공격자에게 연결해주는 방식이네요. 셸을 통째로 열어주는 것이기 때문에 상당히 위험한 취약점이지만 이 모든 게 성립하려면 1) 사용자가 계속 특수 파일을 열고 있어야 하고(닫으면 공격자와 연결된 세션이 종료됨), 2) 사용자의 OS에 설치된..
logrotate 는 특정 파일을 일정 시점, 크기 등 지정된 조건에 따라서 백업해주는 명령어이다. 주로 시간이 지남에 따라 한 없이 커질 수 있는 로그파일을 logrotate 를 통해 주기적으로 백업하는데 이용된다. 예를들어 system.log 라는 파일이 매일 1 GB 씩 내용이 누적된다고 하면 한달이면 벌써 30 GB 가 되버리고 그 파일 자체를 핸들링하는게 매우 어렵게 된다 ( 파일 안에서 특정 단어를 검색한다던지 ). 이럴 때 logrotate 를 통해 매일 지정된 시간에 system.log.1.gz, system.log.2.gz, system.log.3.gz... 으로 자동 백업하거나 파일 크기가 일정 사이즈 이상 되었을 때 분할 할 수 있다.우선 logrotate 는 심플한 소개가 달려있다...
vim 에서 개발을 하다보면 여러줄에 걸쳐 동일한 메시지를 입력해야 하는 경우가 한번씩 있다. 그게 주석처리 문자( // )일 수도 있고, 혹은 메시지 추가일 수도 있는에 아래에서 그 방법을 살펴보도록 하자.우선 기본적으로 블럭 지정을 할 수 있어야 한다. 멀티라인에 커맨드를 날리기 위해서는 Ctrl + v 로 멀티라인 커맨드를 적용할 블럭을 지정하고, Shift + i 로 vim 을 편집모드로 만든다. 그리고 수정 하려는 문구를 추가하고 ESC 를 두 번 눌러주시면 된다. 필요하면 아래 영상도 참고해보도록 하자. 참 쉽다. :-) 멀티라인에 탭 같은 공백을 넣을 때는 아래 방법이 더 편하다.- { ... } 블록 시작이나 끝에서 >% - 숫자 + '>>'
crontab 은 어떤 주기적인 처리를 꽤 영리하게 도와주는 Linux 시스템에 없어서는 안될 스케줄러이다. 특정시간에 파일시스템을 정리한다던가 주기적으로 알람을 발송한다던가 또는 시스템 자원을 모니터링한다던가 등등 많은 활용분야가 있겠다.이렇게 편한 크론탭을 사용할 때 잊어서는 안되는 중요한 사실이 있다. 바로 스케줄러에 의해 실행되는 job 은 [cron] 권한으로 실행된다는 점인데 그렇기 때문에 우리는 아래 두가지 사항을 항상 체크해야 한다.스케줄링 하려는 명령어의 PATH (환경변수)가 cron 에게 있는지.스케줄링 하려는 명령어를 cron 이 실행시킬 수 있는지 ( = 권한이 있는지 )첫번째 내용의 경우에는 그냥 습관처럼 명령어의 절대경로를 써주면 해결된다. 극단적인 예를들어 리눅스의 date ..
윈도우에 질려 리눅스로 넘어온 대부분의 사용자들이 가장 불편하게 느끼는 부분이 바로 터미널에 대한 높은 의존도일 것이다. 리눅스의 높은 진입장벽은 그렇게 만들어진다. 사실 요즘 세상이 좋아져서 리눅스도 윈도우 뺨치는 GUI 가 많이 등장했지만 우리가 리눅스를 사용하는 근본적인 이유는 시스템의 모든 것을 스마트하게 제어할 수 있는 터미널의 존재 때문이니 GUI 는 중요하지 않다. (윈도우에는 command 가 터미널의 역할을 수행한다고 할 수 있다.) 어느정도 터미널을 익숙하게 사용할 수 있게되면 그때부터는 그 매력에서 빠져나오지 못할 것이다. 터미널을 사용한다는 것은 다양한 shell 을 통해 시스템의 환경을 설정하고 조작하는 것을 의미하겠다. shell 은 시스템 제어와 모니터링을 위한 다양한 명령어를..
*NIX 머신에 SSH (혹은 Telnet) 로 원격 접속을 하고 프로세스를 백그라운드로 실행하는 경우에 로그아웃(exit)시 실행 됐던 프로세스가 중지 되버리는 현상을 보게 된다. 이는 원격으로 접속한 Shell 이 SSH 연결을 끊는 경우 종료되면서 자식 프로세스에 모두 STOP 시그널을 전송하기 때문인데 이것을 회피하는 몇 가지 방법을 기술한다. 의존 관계 없이 백그라운드로 실행 prog.sh > /dev/null >2&1 & 모든 output 을 생략하고 백그라운드로 실행. 부모와 Shell 과 의존이 없기 때문에 SSH 연결이 종료 되어도 prog.sh 은 계속 실행 상태를 유지한다. nohup nohup prog.sh & 말 그대로 HUP 신호를 무시하는 명령어이다. 보다 자세한 설명은 위키를..
OpenSource 를 보거나 동적 메모리 관련 교육을 살펴보면 아래와 같은 코드를 종종 볼 수 있다. 아래 코드는 사용한 메모리를 해제하는 구문이다.free(pointer); pointer = NULL; 사실 free 만으로 메모리는 해제되지만 문제가 되는 부분은 해제된 메모리 영역이 우연찮게 다른 곳에서 사용되는 경우 프로그램의 오동작을 피하기 어렵다는 것. 또한 디버깅에도 쉽지 않다. 아래 코드를 통해 극단적인 예시를 살펴본다.#include #include #include int main(void) { char *str = NULL; int *addr = 0; str = (char *)malloc(10); strncpy(str, "test", strlen("test")); printf("str(%..
iconv 개론C/C++ 기준으로 개발을 하다보면 문자열을 특정 케릭터셋으로 컨버팅 해야하는 경우가 발생하는데 이때 주로 사용되는 library에는 libiconv라는 것이 있다. 사용법은 무척 간단한데 우선 오픈소스인 libiconv를 다운받고 컴파일 하고나서 링킹을 걸어 사용하면 되는데 여기서 이런 소소한 것들은 우선 스킵하도록 한다. 어렴풋한 기억으로는 소스는 단순히 configure와 make만 돌려도 사용할 수 있다. dynamic library는 기본으로 생성되고, static library는 configure에 옵션을 줘야 한다는 점을 기억하자. 마침 이러한 내용은 대부분 아래 링크에서 확인할 수 있다. http://www.gnu.org/software/libiconv/이렇게 컴파일해서 생성..
이러저러한 이유로 Linux에 message queue를 사용하고 있는데, 메시지의 길이가 일정 수치를 넘어가면 문제가 발생했다. sysctl로 확인하고 값을 변경해도 동일. $ sysctl kernel.msg{max,mni,mnb} kernel.msgmax = 65535 kernel.msgmni = 16 kernel.msgmnb = 65535 $ 각 고유한 값을 변경하는 방법은 아래와 같다. $ sysctl -w kernel.msgmax=655350 kernel.msgmax = 655350 보이기에는 잘 변경 된 것처럼 보이지만 실제로 긴 문자열은 처리가 안되더라. 하아. 오랜만에 커널 코드를 열어보자. 서버에서 사용하는 커널 버전은 아래 링크를 통해 구했다. https://www.kernel.org/..
※ 본문에 티스토리 기술 문제로 이미지를 로드 할 수 없게 되었는데 읽는데 큰 지장은 없을 겁니다 이미지에서 문자를 추출하는 기술은 광학 문자 인식(Optical character recognition; OCR)이라는 이름으로 불린다. 이미 많은 OCR 기술이 오픈소스로 등록되어 있는데 여기서는 tesseract-ocr을 사용해서 이미지에 있는 문자를 추출해 보도록 하자. tesseract는 구글에서 지원하는 프로젝트이고 인식률이 OCR 기술 중 굉장히 높은 편에 속한다고 한다. 우선 tesseract-ocr을 다운로드 받고 설치해야 하는데 과정은 아래와 같다. (wiki를 참고하면 더욱 자세하게 확인할 수 있다) 필요한 패키지를 설치한다. $ sudo apt-get install autoconf aut..
tesseract-ocr을 configure 하다보면 아래와 같은 오류가 출력되는 경우가 있다. configure: error: Leptonica 1.74 or higher is required. Try to install libleptonica-dev package. 무려 Ubuntu 16.04 인데 말이다!! 우선 이미지 프로세싱에서 사용되는 leptonica 버전을 1.74 혹은 그 이상으로 올려야 한다는 의미인데, tesseract-ocr wiki 에서 아래와 같이 관련된 내용을 찾아 볼 수 있다. but if you are using an oldish version of Linux, the Leptonica version may be too old, so you will need to build..
리눅스 시스템은 부팅시에 자동으로 스크립트 실행을 통해 특정 데몬의 시작 여부를 결정할 수 있는데, 이를 간편하게 제어할 수 있도록 제공되는 명령어라 chkconfig 되시겠다. 명령어의 도움말을 보면 아래와 같이 무척 간단해 보인다.chkconfig --help 우선 이 명령어를 이해하기에 앞서 CentOS의 부팅모드를 이해하고 있어야 한다. /etc/inittab 에서 현재 시스템의 모드를 확인할 수 있는데, 샵(#)은 주석이니 신경 쓸 필요 없고 마지막에 id 값을 보면 3 (Full multiuser mode)으로 설정 된 것을 기억한다. 가장 보편화되어 사용하는 sshd의 상태를 예제로 살펴보기로 한다. 현재 sshd의 상태는 아래와 같고, 0~6까지 나타내는 숫자는 바로 위에 inittab에서..
Linux에서 Application을 개발하다 보면 가장 힘든 것이 데몬이 "어쩌다가" 죽는 경우이다. 죽는 빈도가 잦거나 특정 상황이 유추되면 그나마 괜찮은데, 짧게는 일주일, 길게는 한달에 한번 죽는다면 디버깅 하기도 힘들고 관련 정보를 얻는 것도 녹록치 않다. 이때 유용하게 사용할 수 있는 것이 CentOS 6 이상에서 기본 제공되는 abrt를 이용하는 것이겠다. (CentOS 5 이하는 아래 내용이 포함되어 있지 않다.) 우선 이 기능은 프로그램 상에 올라가는 데몬이 죽게되면 coredump를 파일로 남기는 것이고, 후에 이 coredump를 gdb에서 활용해서 bracktrace 등 다양하게 디버깅이 가능하겠다. 기능을 활성화하는 방법은 아래와 같다. 1. /etc/abrt/abrt-action..
프로그램을 협업으로 개발하다보면 어느정도 규칙이 필요하다. 그렇지 않고 본인 스타일대로 개발을 시작하면 나중에 merge된 소스는 엉망이 될 수 있기 때문이다. 이런 사태를 방지하기 위해 프로그래밍 규칙은 변수명, 함수 스타일, 들여쓰기 등등이 있지만 여기서는 주석에 대해 다뤄본다. (이러한 규칙은 프로젝트 별로 다르고, 언어마다 천차만별이다.)이 포스팅은 주석을 일관된 형식에 맞춰 달 수 있도록 도와주는 툴킷인 Doxygen에 대한 설명이다. 우선 Doxygen은 Vim의 툴킷으로 아래 링크에서 다운로드할 수 있다. http://www.vim.org/scripts/script.php?script_id=987본인이 사용하는 Vim의 버전에 맞는 툴킷을 받아 설치하도록 하자. 설치는 다운로드 받은 Doxy..
VIM에 낱말 자동완성 기능은 bash, php, python 등 스크립트 언어를 개발할 때 무척 편리하다. C/C++ 같은 경우 선언되지 않은 변수를 사용하면 바로 compiler가 에러를 내뱉지만, 스크립트 언어는 변수명에 오타가 있어도 선언과 동시에 사용이 되어버리기 때문이다. 우선 낱말 자동완성 기능을 사용하려면 VIM 공식 홈페이지에서 autocomplpop 관련 플러그인을 다운받고 설치해야 한다.링크를 통해 접속하면 아래와 같이 버전별로 다운받을 수 있으니 적당한 버전을 다운 받도록 하자. (간혹 VIM과 버전 호환이 맞지 않는 경우가 있으니 참고하도록 한다.) 다운받고 압축 파일 내부를 보면 세 개의 폴더가 있다. 각 폴더 별로 설정파일 한 개 씩이 존재하는데 모두 그대로 VIM 설정 폴더 ..
문자열을 특정 구분자로 잘라서 파싱할 때 유용하게 사용되는 함수가 바로 strtok 되시겠다. 하지만 많은 웹사이트 글처럼 이 함수는 thread 에서 안전하지 못하다. 즉, 의도치 않게 동작할 수 있다는 의미인데 어디에도 명쾌하게 이유를 설명한 글이 없어서 직접 작성해본다. 우선 strtok 의 함수 원형을 glibc 에서 찾아보면 아래와 같다. /* Parse S into tokens separated by characters in DELIM. If S is NULL, the last string strtok() was called with is used. For example: char s[] = "-abc-=-def"; x = strtok(s, "-"); // x = "abc" x = strtok..
- Total
- Today
- Yesterday