기본 콘텐츠로 건너뛰기

라벨이 Linux인 게시물 표시

Linux에서 find결과를 시간 순서대로 정렬하기

때때로 어떤 디렉토리 내용을 수정시간 순서(보통 역순)대로 정렬할 필요가 있다. 그럴 때 사용할 수 있는 옵션이 -printf 옵션이다. %T+는 마지막 수정시간을 YYYY-MM-DD+HH:MM:SS.ssssssssss 형태로 출력한다. 참조: https://man7.org/linux/man-pages/man1/find.1.html find /path/something/ -mindepth 1 -maxdepth 1 -type d \ -name 'myapp-*' -printf "%T+\t%p\n" | \ sort -r | awk -F'\t' '{print $2}'

Date in Bash

날짜/시간을 Bash에서 쓸 때, 사용한 date 유틸리티 정리 POSIX 파싱 $ date -jf '%Y%m%d' '20220714' 출력 $ date -jf '%Y%m%d' '20220714' '+%Y%m%d' 계산 # 불가능 GNU extension 파싱 $ date '+%Y%m%d' -d '20220714' 계산 $ date '+%Y%m%d' -d '20220714 +1day'

Sed 특정 문자열 포함 줄 제외하기

작업을 하다보면 sed를 많이 쓰는데, 특정 문자열을 포함하고 있으면 해당 줄을 넘기고 싶을 때가 있다. 넘기고자 하는 패턴에 명령어를 "n"을 붙이면 넘어간다. #!/bin/sed -Ef /\s?ldap\s?/n s/^(passwd:.*)/\1 ldap/g s/^(group:.*)/\1 ldap/g s/^(shadow:.*)/\1 ldap/g 참조:  https://www.gnu.org/software/sed/manual/sed.html

OS issue type

UNIX-like OS가 정말 많은데, FreeBSD, MacOS 등이야 대충 때려 맞출 수 있지만, RedHat계열(RHEL, Fedora, CentOS, Suse)과 Debian계열(Debian, Ubuntu) 디렉토리 위치나 이름 규칙이 미묘하게 달라서 Bash Shell에서 알고 싶을 때가 있다. 딱히 정답이 있는 것은 아니지만, /etc/os-release 값에서 ID를 추출하면 적당히 써먹을 수 있다. $ export LINUX_ISSUER=$(cat /etc/os-release | awk 'BEGIN {FS="="} /^ID=/ { print $2 }'|sed "s/\\('\\|\"\\)//g") 사실 /etc/issue를 봐도 되는데, Docker에선 단순히 "Kernel"로만 보인다.

Delta RPM

Fedora19를 쓰면서 yum update를 할 때, drpm이라는 확장자가 보였다. Downloading packages: (1/2): updates-testing/19/x86_64/prestodelta                                                           | 1.4 MB  00:00:12      (2/2): fedora/19/x86_64/prestodelta                                                                    | 1.7 MB  00:00:12      Delta RPMs reduced 102 M of updates to 9.5 M (90% saved) (1/41): NetworkManager-0.9.8.1-4.git20130515.fc19_0.9.8.2-1.fc19.x86_64. drpm                           | 573 kB  00:00:11      (2/41): NetworkManager-glib-0.9.8.1-...

find-debuginfo.sh에서 오류가 났을 경우

Source RPM을 빌드하다가 아래와 같은 문구를 출력하면서 뻗을 때가 있다. + /usr/lib/rpm/find-debuginfo.sh /usr/src/redhat/BUILD/my_package-1.0.1 find: invalid predicate `' 보통 debuginfo 패키지를 만들려고 하다가 문제가 발생한 경우인데, 제대로 하려면 BuildRoot를 정해야하지만, 굳이 debuginfo가 필요 없다면 spec 파일 맨 위에 아래 구문을 넣어 debuginfo 패키지 생성을 막을 수 있다. %define debug_package %{nil} 참조:  http://stackoverflow.com/questions/1879734/rpm-build-error  

필요한 명령만 패스워드 입력 없이 sudo 하기

* 보안과 편의는 종종 창과 방패와 같은 관계이다. 이 글 역시 편의를 위해 보안을 희생하는 것이며, 이에 대한 책임은 실행한 각자가 진다. 종종 우분투를 사용하면서 root 권한을 필요로 하는 경우는 거의 없다. 그러나 매일 아침, 신문을 들고 어제 있었던 뉴스를 보는 것처럼, 업데이트 관리자를 실행해 새로운 패키지가 있는지 확인하는 일로 하루를 시작하곤 한다. 이때 다소 귀찮지만, 새로운 패키지가 나오면 비밀번호를 입력해 root 권한을 얻어 설치하곤 한다. update-manager와 같이 필요한 프로그램만 sudo로 실행할 때, 비밀번호 입력 없이 실행할 수 있는 방법이 없을까. 당연히 있다. 없으면 이 글을 쓰지도 않았다. sudo 설정파일을 수정하면 설정한 프로그램에 한해서 비밀번호를 물어보지 않는다. 설정파일은 /etc/sudoers이지만, 패키지 관리 등을 위해 해당 파일을 직접수정하는 것보다, /etc/sudoers.d/ 디렉토리에 적당히 0440 권한으로 파일 하나 만들어 세팅하는 것을 권장한다. 사실 RTFM 말처럼 man sudoers를 호출하면 설정파일 문법이 나오지만, 복잡하고, 그렇게 까지 자세히 알고 싶지 않다면 적당히 아래와 같이 설정하자. $ sudo su - $ vi /etc/sudoers.d/mysudoers myid ALL = NOPASSWD: POWEROFF, SHUTDOWN, HALT, /usr/bin/update-manager $ chmod 0440 /etc/sudoers.d/mysudoers $ exit myid는 허가할 아이디이고, ALL은 허가할 호스트랄까... NOPASSWD:는 실행태그로 암호입력을 받지 말라는 것이다. 그 뒤에 허락할 명령을 나열할 수 있고, POWEROFF, SHUTDOWN, HALT 등은 이미 sudoers 안에 alias로 지정한 명령이고, 그 뒤에 사용할 /usr/bin/update-manager 를 지정하였다. = _=|a 사실 이...

Debian FreeBSD

FreeBSD 포트 시스템 힘드네... Debian gets FreeBSD kernel support 아무리 날고 기는 패키지 관리 시스템이라도 내 손에 익지 않으면 그림의 떡일 뿐. FreeBSD Port System... 어려워... 문서도 못 찾겠고... 자꾸 Gentoo처럼 소스 받아다가 컴파일 하려고 하고... 그런데 데비안이 Linux 기반 배포판 말고 FreeBSD 기반 배포판도 만든다고 하니, 두 손 들고 박수 쳐줄께. 이제 FreeBSD 환경에서 apt-get만 하면 되는건가? (이미 FreeBSD 쪽에서 apt도 port 안에 넣어 놓은 것 같긴 하지만) Users might prefer a FreeBSD kernel to get support for certain features, such as Network Driver Interface Specification (NDIS) drivers and possibly Sun's ZFS file system, that might not be found on Linux, according to Debian developers. In a document defending kFreeBSD, they said some users have found FreeBSD to have better performance or stability than the Linux kernel . 요즘 시대에 OS 성능 견주기는 그다지 의미가 없을 것 같은데. 도토리 키 재기 아닐까? 서버 하나 당 어마어마한 트래픽을 받는 것이 아니라면, 손에 익은거나 관리하기 쉬운 OS를 선택할 것 같다. "kFreeBSD offers an alternative in case Linux is branded illegal by the SCO case or other threats," the developers wrote. "In legal terms, Linux sources are like a minefie...

리눅스 데스크탑... 글쎄?

AMD x64 3000+와 512M램으로 버티고 있는 구리구리한 컴퓨터에 리눅스를 깔았다. 그동안 고집하던 Fedora는 깔 때마다 라이센스별 저장소 선택해서 깔기 귀찮아서 날리고, 정말 오래간만에 Ubuntu로 깔았다. 설치부터 데스크탑을 띄워 각종 업무를 하는데까지 개인적으로 윈도우즈 XP, Vista 보다 훨씬 괜찮은 것 같다. 글꼴도 기본 글꼴은 아직 애매하지만, /usr/share/fonts 에 적당히 디렉토리 하나 만들어서 잘 쓰는 글꼴 파일 넣어두면 전체적인 화면도 봐줄만 하다. 드라이버 역시 Fedora에서 매번 실패해서 기본 드라이버로 쓰고 있었지만, Ubuntu는 ATI 드라이버를 잘 설치해줬다. XP/Vista에서 따로 설치해야했던 무선NIC 드라이버(RaLink칩셋)도 따로 설치 프로세스 없이 자동으로 연결해서 쓰고 있다. 게다가 프린터도 HP PhotoSmart C7280을 무선으로 연결해서 사용하는데, 설치부터 CD가 필요없고, 그렇다고 느려터진 HP 홈페이지에서 받는 것도 아닐 뿐더러, 미러링한 저장소에서 적당히 긁어다가 잘 설치한다. 되려 Vista에서 프린터 감시한다고 지랄지랄하던 프로세스가 없어서 Vista보다 가볍고 빠르게 인쇄를 사용하고 있다. (논외로 Vista 설정문제인지 양면인쇄하면 100% 종이가 걸리는데, Fedora나 Ubuntu에선 그런 적이 한 번도 없었다.) 게임은 딱히 즐겨하는 것이 없고, 요즘엔 Wii에 올인하는 터라(그보단 이 컴퓨터에서 뭘 돌릴 수 있을꺼라 생각해?), 해당 장단점을 말할 것이 없다. 인터넷이야 불여시로 대충 끄적끄적 할 정도면 만족하며, 보통 돌아다니는 곳이 ActiveX를 현란하게 쓸만한 곳이 아니기에(각종 카페나 블로그, 게시판 정도?), IE가 별로 그립지 않다. 물론 은행업무는 다른 컴퓨터로 해야하지만 말이다. Flash가 있는 사이트도 Fedora는 이것저것 설정해서 들어갔지만, Ubuntu는 적절한 절차를 걸쳐 설치해준다. 기본 멀티미디어 플레이어 토템이 썩 예쁘지 않기 때...

친절하지 못하면 선택 받기 힘들다

요즘 후배가 FreeBSD 를 깔면서 며칠 째 고생하고 있다. FreeBSD 설치 화면이 윈도우즈 그것에 비교할 수 없을 정도로 불친절하기 때문이다. (물론 네트워크 성능 하나만큼은 미칠 듯이 좋지만) 2000년... 대학교 들어와서 처음 마주해본 리눅스라는 녀석이 지금 FreeBSD와 같았으리라. 그때도 배우기 싫고, 불친절한 녀석과 마주하기 싫었다. (지금은 밥벌이의 매우 소중한 존재가 되었다) 그랬던 녀석이 지금은 윈도우즈와 비슷하게 화려해지고 친절해졌다. 번역문서도 엄청 많아졌고, 같이 이야기를 나눌 수 있는 상대도 많아졌다. 정말 많이 친절하고 좋아졌다. 반면 FreeBSD는 어떠한가. 물론 FreeBSD 역시 번역문서도 제법 있고, 철학 자체가 군더더기 없는 OS라고 하지만, 초보자가 언뜻 다가서기엔 너무나 먼 당신 이다. 물론 닥치면 내가 2000년에 만난 리눅스처럼 강제로 배우겠지만, 그렇지 않으면 윈도우즈나 리눅스를 선택할 것이다. 이거 왠지 케케묵은 어떤 OS가 더 좋냐 식의 떡밥이 될 수도 있겠지만, 말하고자 하는 바는 OS 성능이 아니라 UX 를 말하고자 하는 것이다. 친절하지 못하면 선택 받기 힘들다. 원본 위치: http://purewell.egloos.com/4002541

POSIX shared memory

일전에 언급한 SysV 에서 처음으로 세상에 내동댕이 쳐진 IPC 집합 가운데에서 공유메모리부터 보겠다. SysV가 가진 API는 POSIX.1-2001에도 올라와 있는 녀석이긴 하다. 함수는 shmget, shmat, shmdt, shmctl 등이 있다. 엄청나게 유명한 녀석이기 때문에 따로 자세히 설명하지 않겠다. shmget으로 공유메모리를 커널에 요청한다. 그럼 커널일 공유메모리객체를 만들기만 할 것이고, shmat을 통해 실제 프로세스 메모리에 공유메모리를 쳐바를(attach) 수 있다. shmdt는 쳐바른 공유메모리를 떼어내는데(detach) 사용하고, shmctl은 공유메모리객체를 정리하거나 기타 객체를 조작하는데 잠깐 이용한다. - 설명끝 - shm_open은 SysV와 별도로 POSIX.1-2001에 올라온 녀석인데, 역사는 잘 모르겠고(2001년에 나왔겠지~ 하하하~), SysV용과 달리 메모리 사용량 조절이 가능하다. 왜냐구? 파일이니까. shm_open는 UNIX가 가지고 있는 open함수와 매우 흡사하며, 결과값 역시 FD를 내놓는다. 파일을 다루는 각종 함수를 사용할 수도 있고, mmap 함수를 이용해서 shmat처럼 프로세스 메모리 공간에 쳐바를 수도 있다. 문제는 공유메모리라는 '파일'이 어디에 만들어지는지 모르기 때문에(OS마다 달라!) shm_unlink라는 함수도 별도로 제공한다. 일단 생김새는 open함수와 비슷하다. int shm_open(const char* name, int oflag, mode_t mode); name은 공유메모리객체의 이름이 들어간다. 맨페이지에 따르면, 어디든 포팅하기 쉽게 사용하려면 슬래시가 맨 처음에 단 하나만 들어가는 이름을 사용하라고 한다. (예: /myshare.shm) oflag는 이것을 읽기용, 쓰기용, 생성, 이미 있으면 잘라버릴지를 결정한다. 플래그는 O_RDONLY, O_RDWR, O_CREAT, O_EXCL, O_TRUNC 등이 있다. mode는 접근제어로 ...

*printf와 EILSEQ

뭔가 glibc 버전 별로 버그인 것 같다. 아래 소스를 보자. #include <stdio.h> #include <stdlib.h> #include <errno.h> int main(int argc, char* argv[]) { printf("%s 한글\n", "한글"); printf("%d\n", errno); return EXIT_SUCCESS; } 컴파일하고 실행하자. $ export|grep LANG LANG=" ko_KR.eucKR " $ gcc -o prn prn.c $ ./prn 한글 한글 84 84라 함은 리눅스에서 EILSEQ 이며, iconv나 mbs*wcs형 함수에서 입력 데이터에 잘못된 데이터가 왔을 때(변환 불가능한 어떤 바이트 순서), 뱉어낸다. 2.4.x에서 *printf는 %s에 대해 mbs*wcs류 함수를 호출하여 변환하며, mbs*wcs 함수에서 한글(CP949)이 형식문자열에 들어갔을 경우 EILSEQ를 반환한다. glibc 2.7.x에서 실행할 경우 EILSEQ을 세팅하지 않는다. glibc ChangeLog를 언제 살펴보나... 귀찮은데... 해당 내용은 다음 주 이 시간에????? 원본 위치: http://purewell.egloos.com/3708549

gdb로 errno를 붙잡아보자

가끔씩 Linux 에서 GDB로 errno를 보고 싶을 때가 있는데, 그럴 때마다 " Cannot access memory at address 0x8 "를 뱉어내곤 한다. 쩝쩝 errno가 멀티 스레드 환경 에서 여기저기에서 세팅되는 현상을 막기 위해 함수 (스레드에 따라 다른 errno 주소를 반환)로 구현한 것을 매크로 로 재설정했기 때문이다. 매크로는 /usr/include/bits/errno.h에서 아래와 같이 정의하였다. #define errno (*__errno_location ()) 만약 errno 값을 보고 싶으면 일단 프로세스를 돌리고 (gdb) p (*__errno_location()) watch는 좀 복잡하다. 일단 errno의 포인터를 얻고 그것이 가르키고 있는 곳에 값을 감시하도록 하자. (gdb) p /x (__errno_location()) $1 = 0xb7fea6a0 (gdb) watch (*(int*) 0xb7fea6a0 ) Hardware watchpoint 2: *(int *) 3086919328 (gdb) c Continuing. Hardware watchpoint 2: *(int *) 3086919328 Old value = 0 New value = 22 0x0050c885 in __read_nocancel () from /lib/tls/libc.so.6 뭐 이런 것이다. 근데 왜 errno를 __thread int로 정의하지 않은걸까? 원본 위치: http://purewell.egloos.com/3708249

기본으로 열리는 FD

Linux에서 기본으로 열리는 FD는 흔히 표준입력(0), 표준출력(1), 표준오류(2)로 알고 있으며, 각 FD는 0, 1, 2이다. 이는 POSIX에서 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO라는 매크로로 정의하였다. 과연 그뿐일까? 아래와 같은 프로그램을 만들어 컴파일 한 뒤 돌려보자. #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> int main(int,char**) { printf("%d\n",socket(AF_INET, SOCK_STREAM, 0)); return 0; } 컴파일하여 쉘에서 바로 실행하면 3을 얻을 수 있다. -1이 나온다면 버려. ㅡ_-) $./fdcnt 3 gdb에서 실행하면 어떻게 될까? $gdb ./fdcnt GNU gdb Red Hat Linux (6.6-43.fc8rh) Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu"... (no debugging sym...

누구 잘못인지 좌시하지 않겠다

풀리지 않던 수수께기가 오늘 풀렸다. 열심히 어떤 I/F를 호출하는데 인자로 'name'이 들어가야 한다. 그러나 오늘 vim으로 내가 짠 소스를 다시 까보니 'nmae'이라고 들어가 있었다. 분명히 난 'name'으로 썼단 말이다! 이것은 음모야! Linux, VIM, GCC, BASH 이 중에 하나야. 누구 잘못인지 좌시하지 않겠다! Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3525106

Linux /proc/pid/stat 구조

Linux 2.6 / 출처: http://linux.die.net/man/5/proc ㅡ_-) 중간에 쓰이지 않는 '0' 필드가 있으니 주의!!! pid %d     The process ID. comm %s     The filename of the executable, in parentheses. This is visible whether or not the executable is swapped out. state %c     One character from the string "RSDZTW" where R is running, S is sleeping in an interruptible wait, D is waiting in uninterruptible disk sleep, Z is zombie, T is traced or stopped (on a signal), and W is paging. ppid %d     The PID of the parent. pgrp %d     The process group ID of the process. session %d     The session ID of the process. tty_nr %d     The tty the process uses. tpgid %d     The process group ID of the process which currently owns the tty that the process is connected to. flags %lu     The kernel flags word of the process. For bit meanings, see the PF_* defines in <linux/sched.h>. Details depe...

Linux에서 CPU 사용률 구하기

procps 패키지에서 top 소스를 까보면 쉽게 알 수 있다. 일단 CPU개수를 구해야하는데, sysconf(_SC_NPROCESSORS_ONLN)로 쉽게 구할 수 있다. (아쉽게도 표준이 아니므로 다른 OS에서 잘 돌아간다는 보장은 없다) 다음은 현재 CPU 사용률을 구해야하는데 리눅스는 이것을 /proc/stat에 텍스트 형태로 저장한다. 형태는 아래와 같다. cpu user system nice idle wait hi si zero cpu? user system nice idle wait hi si zero (반복...) 첫 라인은 전체 cpu 평균을 가르키는 것 같다.(막가는거지요?) 다음 줄부터는 CPU 정보를 cpu0부터 표기하였다. 각 필드는 리눅스 시간 단위인 jiffies로 내용은 아래와 같다. user : 사용자 영역 코드 실행 시간 system: 커널 영역 코드 실행 시간 nice : 기본보다 낮은 우선순위로 실행한 사용자 영역 코드 실행 시간 idle : I/O 완료가 아닌 대기 시간 wait : I/O 완료 대기 시간 hi : Hard Interrupt(IRQ) si : Soft Interrupt(SoftIRQ) zero : 끝 위 필드는 stat파일을 열 때, 컴퓨터를 켠 시점부터 jiffies누적이므로 top에서 보여주는 사용률을 구하기 위해서 이전 값을 저장해서 현재 값과 차를 구해야한다. 각 사용률(percent)를 위한 총합은 위에 제시한 모든 필드를 몽땅 더하는 것으로 구할 수 있다. 참고로 위 값은 커널 버전에 따라 wait, hi, si 필드가 없을 수 있다. 2.6 이상 버전은 모두 표시하기때문에 가볍게 넘어가도록 하자. Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3513312

Message Queue of UN*X

발로 짠 UN*X message queue 프로그래밍. 아... 귀찮스러... CMake가 깔려 있다면, 아래와 같이 입력하면 대략 안성 맞춤이다. $ cmake . $ make msgprj.zip 원본 위치: http://purewell.egloos.com/3506312

FreeBSD에서 shm_open은 open일 뿐이다.

Linux에서 잘 써먹고 있는 파일처럼 쓸 수 있는 shared memory interface인 shm_open. 이게 표준안(POSIX.1)에 있길래 아무런 의심 없이 잘 썼지. 그런데 아쉽게도 FreeBSD에서 이 녀석은 단순히 open을 wrapping한 것일뿐. 즉, 그냥 일반 파일을 조작하는 것에 불과하다는 것이지. 현재 FreeBSD 6.2가 나왔지만 FreeBSD에서 제공하는 man page 에는 아직도 래핑함수라는 걸 명시하고 있네. In the FreeBSD implementation, POSIX shared memory objects are implemented as ordinary files.  The shm_open() and shm_unlink() act as wrappers around the open(2) and unlink(2) routines, and path, flags, and mode arguments are as specified for those functions.  The flags argument is checked to ensure that the access mode specified is not O_WRONLY (which is not defined for shared memory objects). 에구구... 안타까워라. 실제로도 FreeBSD에서 shm_open하면 실행한 디렉토리에 바로 파일이 만들어지네... Powered by ScribeFire . 원본 위치: http://purewell.egloos.com/3502714