반응형

출처 : http://blog.tanelpoder.com/2009/01/22/identifying-shared-memory-segment-users-using-lsof/

lsof를 사용하여 공유메모리 사용자를 식별하기

lsof(열린 파일의 목록을 보여주는 프로그램)은 지워진 파일의 해제 또는 공유메모리의 삭제를 방해하는 열려있는 파일 디스크립터의 문제를 해결하는데 매우 유용한 도구입니다.

이 예시는 리눅스에서 Oracle 사용자의 공유메모리가 해제되지 않고 아직 사용중이라고 표시되고 있는 상황입니다.

$ ipcs -ma

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 393216     oracle    640        289406976  1          dest
0xbfb94e30 425985     oracle    640        289406976  18
0x3cf13430 557058     oracle    660        423624704  22

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0xe2260ff0 1409024    oracle    640        154
0x9df96b74 1671169    oracle    660        154

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

진하게 표시된 줄은 인스턴스가 닫힌 후에 사라져야 하지만 그렇지 못했습니다. "nattch"(공유메모리에 접근한 프로세스들의 수)로부터 저는 공유메모리를 사용하는 몇개의 프로세스가 아직 있다는 것을 알았습니다. 그래서 이 조각은 해제되지 않았고 ipcrm 명령어조차 그것(누군가 파일들을 열었다면 정상 파일인것처럼)을 삭제할 수 없었습니다.

그래서 이 공유메모리를 사용하는 프로세스를 식별할 필요가 있었습니다. 만약 보통 존재하는 파일이었다면 어떤 프로세스가 그 파일을 열었는지 /sbin/fuser 명령을 사용했겠지만 이 명령은 디렉터리에서 현재 존재하는 파일에 대해서만 작동합니다.

하지만 지워진 파일, 소켓이나 공유 메모리를 위해서는 lsof 명령을 사용할 수 있습니다. (보통 리눅스에 기본으로 설치되어 있지만 Unix에서는 별도로 다운로드 받아 설치해야 합니다.)

ipcs -ma가 보여주듯이 사용중인 SHM ID는 393216이며 저는 SHM ID를 grep하여 모든 열여 있는 파일 디스크립터를 보여주도록 lsof를 다음처럼 실행하였습니다.

$ lsof | egrep "393216|COMMAND"
COMMAND     PID      USER   FD      TYPE     DEVICE       SIZE       NODE NAME
python    18811    oracle  DEL       REG        0,8                393216 /SYSVbfb94e30

NODE 열에 대응되는 ipcs의 출력된 SHM ID와 대응되는지 알 수 있습니다.
그래서 저는 아직 SHM 에 접근 중인 PID 18811을 kill 하였습니다.

$ kill 18811

$ ipcs -ma

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0xbfb94e30 425985     oracle    640        289406976  18
0x3cf13430 557058     oracle    660        423624704  25

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0xe2260ff0 1409024    oracle    640        154
0x9df96b74 1671169    oracle    660        154

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

해당 공유메모리가 사라지고 해제되었습니다.

명령은 다른 작업을 하는데도 매우 유용합니다. 예를 들어, 네트워크 프로토콜, IP, port 등 열여 있는 소켓을 보여주기도 합니다. 예를 들어 OS level에서 어떤 클라이언트가 서버 프로세스와 통신하는 지 확인 할 수 있습니다.

$ lsof -i:1521
COMMAND   PID   USER   FD   TYPE DEVICE SIZE NODE NAME
tnslsnr  6212 oracle   11u  IPv4  49486       TCP *:1521 (LISTEN)
tnslsnr  6212 oracle   13u  IPv4 276708       TCP linux03:1521->linux03:37277 (ESTABLISHED)
tnslsnr  6212 oracle   14u  IPv4 264894       TCP linux03:1521->linux03:41122 (ESTABLISHED)
oracle  22687 oracle   20u  IPv4 264893       TCP linux03:41122->linux03:1521 (ESTABLISHED)
oracle  25250 oracle   15u  IPv4 276707       TCP linux03:37277->linux03:1521 (ESTABLISHED)
oracle  25530 oracle   15u  IPv4 279910       TCP linux03:1521->192.168.247.1:nimsh (ESTABLISHED)

불행히도 lsof는 클래식 유닉스에서 기본적으로 설치되지 않지만 일부에서는 시스템 관리자가 설치하기로 선택했습니다. 그러나 lsof는 /dev/kmem 또는 이와 유사한 것을 통해 커널 메모리 구조에 액세스해야 하므로 일반 사용자에게는 작동하지 않을 수 있습니다. lsof에 액세스할 수 없다면 lsof가 할 수 있는 몇 가지 트릭을 수행할 수 있는 다른 도구가 있을 수 있습니다. 예를 들어 Solaris에는 프로세스의 열린 파일을 표시할 수 있는 유용한 명령 pfiles가 있으며 (내 생각에는) Solaris 9 부터 네트워크 소켓의 TCP 연결 endpoint도 보고할 수 있습니다…

반응형
반응형

출처 : http://serverfault.com/questions/62411/how-can-i-sort-du-h-output-by-size

크기로 du -h의 출력을 정렬할 수 있나요?

저는 du 출력을 사람이 읽을 수 있는 목록으로 얻고 싶습니다.

하지만, du는 "크기로 정렬"이란 옵션이 없기 때문에 sort로 pipe하는 것은 사람이 읽을 수 있도록 하는 플래그(human readable flag)가 작동하지 않습니다.

예를 들어 다음 명령을 실행하면

du | sort -n -r 

(내림차순으로) 크기로 정렬된 디스크 사용량이 출력됩니다.

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

하지만, 사람이 읽을 수 있도록 하는 플래그(human readable flag)를 사용하여 실행하면 적절하게 정렬되지 않습니다.

du -h | sort -n -r
508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

크기로 du -h를 정렬하는 방법을 아시는 분이 계신가요?


39 개의 답변 중 1개의 답변

2009년 8월에 GNU coreutils 7.5 가 나오고 부터, du -h와 같은 종류의 접미사를 사용하는 -h 파라미터를 sort에서 쓸 수 있습니다.

du -hs * | sort -h

만약 -h를 지원하지 않는 sort를 사용하신다면, GNU Coreutils를 설치할 수 있습니다. 다음은 오래된 Mac OS X 입니다.

brew install coreutils
du -hs * | gsort -h

다음은 sort 매뉴얼 내용입니다.

-h, --human-numeric-sort 사람이 읽을 수 있는 숫자를 비교한다 (예시, 2K 1G)

반응형
반응형

출처 : http://unix.stackexchange.com/questions/16640/how-can-i-get-the-size-of-a-file-in-a-bash-script

bash script 에서 파일의 크기를 어떻게 구할 수 있을까요?

bash script 에서 파일의 크기를 어떻게 구할 수 있을까요?

이를 bash 변수에 할당하여 나중에 사용하려면 어떻게 해야 할까요?


13개의 답변 중 1개의 답변만 추려냄.

GNU 시스템에 대한 최선의 선택:

stat --printf="%s" file.any

man stat 에서는

%s 바이트로 전체 크기

bash script에서는

#!/bin/bash
FILENAME=/home/heiko/dummy/packages.txt
FILESIZE=$(stat -c%s "$FILENAME")
echo "Size of $FILENAME = $FILESIZE bytes."

Mac OS X에서 터미널의 stat 사용하는 방법은 @chbrown의 답변을 보세요.

반응형
반응형

리눅스 shell에 색깔 입히기


bash shell일 경우
~/.bashrc, ~/.bash_profile, ~/.profile 중에서 다음 환경변수를 세팅하시면 됩니다.
PS1='\[\e[1;32m\]'

Korn shell일 경우
다음 환경변수를 세팅하시면 됩니다. bash shell과는 다르게 echo구문이 추가가 됩니다.
PS1="$(echo -e "\033[35mLinux\033[00m")"


반응형
반응형

출처 : http://stackoverflow.com/questions/5658568/how-to-list-processes-attached-to-a-shared-memory-segment-in-linux

리눅스에 공유메모리에 접근한 프로세스의 목록을 아는 방법?

공유 메모리에 접근한 프로세스가 무엇인지 어떻게 알 수 있습니까?

awagner@tree:/home/awagner$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 0          root       777        102400     1                       
0x00000000 32769      root       774        96         1          dest         
0x00000000 98306      awagner    600        393216     2          dest         
0x00000000 131075     awagner    600        393216     2          dest    

예시. 98305 공유메모리에 접근한 2개의 프로세스를 어떻게 알 수 있습니까?


5개의 답변 중 1개의 답변

표준 툴로는 이것을 알 수 없다고 생각합니다. 당신은 마지막으로 접근하거나 공유메모리와 분리된 프로세스의 ID를 ipcs -mp 를 사용하여 알 수 있지만 ipcs로 접근한 모든 프로세스를 아는 방법을 저는 모릅니다.

공유메모리에 접근한 두개의 프로세스가 현재도 공유메모리에 붙어있다고 가정하면 공유메모리를 생성한 PID cpid와 마지막에 접근한 PID lpid를 통하여 두개의 프로세스를 알 수는 있지만 그 이상으로 확장하여 알 수는 없기 때문에 유용함이 제한됩니다.

cat /proc/sysvipc/shm 방법은 비슷하게 제한적이지만 /proc 파일 시스템의 다른 부분으로 프로세스의 목록을 아는 방법이 있다고 믿습니다. 아래를 보시면,

모든 프로세스에 대응하는 procfs(파일시스템)에서 grep을 할 때, cpidlpid의 프로세스들을 포함하는 목록을 얻었습니다.

예를 들어, 다음 공유메모리를 ipcs -m 명령으로 얻었습니다.

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 123456     pax        600        1024       2          dest

그리고 주어진 공유메모리 id (123456)을 통해 ipcs -mpcpid는 3956 이고 lpid는 9999 라는 것을 알아내었습니다.

그리고 명령어 grep 123456 /proc/*/maps 을 통해 다음을 알 수 있습니다.

/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)

그래서 이것이 공유메모리에 접근한 프로세스 목록을 얻는 방법입니다. dest 상태와 (deleted) 표시가 마지막 분리가 발생했을 때 삭제를 위한 표시를 생성자가 했기 때문에 이미 그 공유메모리가 파괴된 것이 아님을 저는 매우 확신합니다.

/proc/*/maps 파일들을 검사함으로서, 당신은 주어진 공유메모리에 현재 접근하고 있는 PID들을 발견할 수 있습니다.


출처 : http://www.linuxforums.org/forum/red-hat-fedora-linux/168472-unable-remove-shared-memory.html

안 지워지는 공유메모리 삭제하는 방법

저 같은 경우에는 위의 방법으로 접근한 프로세스의 목록을 얻은 다음 해당 프로세스를 kill하여 문제를 해결하였습니다.

다음 내용은 위의 출처에서 답변만 번역 하였습니다.

man 페이지는 ipcrm -m 는 삭제를 위해 표시만을 한다고 쓰여 있습니다. ipcs -p는 공유메모리에 접근한 프로세스 id를 제공합니다. 해제하고자 하는 공유메모리에 접근하고 있는 프로세스를 kill하면 그 공유메모리가 사라진 것을 확인하실 수 있습니다.

반응형
반응형

expect

Expect는 스크립트에 따라서 다른 상호작용하는 프로그램과 대화하는 프로그램입니다. 번역된 언어는 대화를 하는 데 있어서 분기와 높은 수준의 제어 구조를 제공합니다. 게다가, 사용자는 스크립트로 원할 때 직접 상호작용하면서 제어를 할 수 있습니다.

Expect는 사용자 수준의 어떤 프로그램이나 작업에 대한 명령어로서 실행될 수 있습니다. Expect는 실제로 동시에 여러 프로그램과 대화할 수 있습니다.

사용예시

https://github.com/SDRLurker/shell

mssh.sh

mssh.sh 실행할서버 SSH포트 "명령"

shell 내의 sexecute() 함수가 있습니다. 

ssh로 서버에 접속하여 $PW를 보내 비밀번호를 자동으로 입력하는 기능을 합니다.

# 원격 서버에 접속하여 shell 명령을 수행합니다.
sexecute()
{

local IP=$1
local PORT=$2
local PW=$3
local MSG=$4 

if [ -z $PORT ]; then
    PORT=22
fi

echo "ssh -p$PORT $IP $MSG"
expect <<EOF
set timeout -1
spawn ssh -p$PORT $IP $MSG # SSH로 $IP와 $PORT로 접속해 $MSG명령을 실행하기 위해 접속
expect "password:"                    # SSH에서 password라는 글자를 받으면 다음 줄로 넘어간다.
send "$PW\r"                              # 비밀번호 $PW 문자열을 입력한다.
expect eof
EOF

}

 


출처

http://linux.die.net/man/1/expect

반응형
반응형

출처 

http://unix.stackexchange.com/questions/163352/what-does-dev-null-21-mean-in-this-article-of-crontab-basics

http://blogger.pe.kr/369

crontab에 관한 글에서 '>/dev/null 2>&1'의 뜻이 무엇인가요?

crontab에 관한 글을 읽고 있습니다.

다음은 자동으로 이메일 보내는 것을 불가능하게 하는 방법에 대한 내용입니다.

8.  이멩일 불가능하게 하기 

기본으로 cronjob을 실행하는 사용자 계정으로 이메일을 보냅니다. 이것이 필요하지 않으면 shell 명령어 끝에 다음 명령을 붙이세요.

>/dev/null 2>&1

2> & ,  1 의 자세한 뜻이 무엇입니까? cronjob 파일의 마지막에 이메일 보내는 것을 끄기 위해 왜 이걸 붙어야 합니까?

-------------

6개의 답변 중 1개의 답변만 추려냄.

>  리다이렉트(redirect)를 위한 것입니다. 

역자 설명) 화면에 출력된 내용(stdout)을 오른쪽에 나올 파일(여기서는 /dev/null)로 결과를 보내라는 뜻입니다.

/dev/null 은 어떤 데이터를 보내든 블랙홀로써 전부 버려질 것입니다.

2 는 표준 에러를 뜻하는 파일 디스크립터(file descriptor) 입니다.

>  리다이렉트(redirect)를 위한 것입니다. 

& 파일 디스크립터를 뜻하는 심볼입니다. (이 기호가 없으면 다음 1 은 파일이름으로 간주될 것입니다.)

1 은 표준 출력을 뜻하는 파일 디스크립터(file descriptor) 입니다.

그러므로 >/dev/null 2>&1 는 프로그램의 출력을 /dev/null로 보냅니다(redirect). 보낼 때 표준에러 와 표준출력이 포함됩니다.

더 많은 정보를 원하시면 리눅스 문서화 프로젝트 페이지 I/O Redirection 에서 확인 가능합니다.

cron 은 job의 출력이 있을 때만 이메일을 당신에게 보낼 것입니다. null로 redirect되는 모든 것에 대해 출력이 없기 때문에 cron은 당신에게 이메일을 보내지 않을 것입니다.



반응형
반응형

출처 : http://stackoverflow.com/questions/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine

ssh를 사용하여 원격 컴퓨터의 shell script를 실행하는 방법?

저는 원격 컴퓨터에서 로컬 shell script(윈도우즈/리눅스)를 실행해야 합니다.

A 컴퓨터와 B컴퓨터 모두에서 설정된 ssh가 있습니다. 저의 스크립트는 B컴퓨터에서 수행할 내용이 A컴퓨터에 있습니다.

로컬과 원격 컴퓨터는 윈도우즈나 유닉스 기반의 시스템일 수 있습니다.

plink/ssh를 사용하여 이를 실행할 수 있는 방법이 있을까요?


20개의 답변 중 1개의 답변

만약 A 컴퓨터가 Windows box라면 -m 파라미터와 함께 Plink(PuTTY의 일부)를 사용하실 수 있고 원격 서버에 로컬(내 컴퓨터의) 스크립트를 실행할 것입니다.

plink root@MachineB -m local_script.sh

만약 A컴퓨터가 유닉스를 기반으로한 시스템이면 다음처럼 사용할 수 있습니다.

ssh root@MachineB 'bash -s' < local_script.sh

이를 수행하기 위해 스크립트를 원격 컴퓨터로 복사하실 필요가 없습니다.


(번역과 관련없는) 추가내용

ssh 뿐만이 아니라 rsh도 똑같은 방법으로 실행이 가능합니다.

ssh root@MachineB 'bash -s' < local_script.sh

ssh 계정명@원격호스트(IP) 수행할명령어 < 로컬_스크립트.sh

만약 원격 컴퓨터의 프로그램이 수행이 되지 않는다면

로컬_스크립트.sh에서 export LD_LIBRARY_PATH를 원격컴퓨터에 맞게 설정하셔야 됩니다.

예) export LD_LIBRARY_PATH=/usr/lib:/usr/local/lib

반응형

'리눅스 shell' 카테고리의 다른 글

expect  (0) 2015.08.09
리눅스 쉘에서 '>/dev/null 2>&1'의 뜻이 무엇인가요?  (2) 2015.07.10
rsync  (0) 2015.02.17
왜 쉘 명령어가 \(백슬래시)로 시작하나요?  (0) 2014.07.08
fg  (0) 2011.08.03
반응형

rsync

rsync는 두 컴퓨터 시스템을 똑같은 파일의 복사본으로 유지하는데 널리 사용되는 유틸리티입니다.

유닉스와 같은 시스템과 파일 동기화와 전송 2가지 모두 기능하는데 널리 사용됩니다.

rsync 알고리즘은 델타 인코딩 형태로 네트워크 사용량을 최소화합니다.

zlib은 추가적인 압축을 하는데 사용될 수 있고 데이터 보안을 위해 SSH나 stunnel이 사용될 수 있습니다.


사용예시

rsync -avz rsync://rsync.iana.org/tz/data/ ~/data/dst

rsync.iana.org/tz/data/의 디렉터리 안의 파일들을 $HOME/data/dst 디렉터리로 동기화 복사를 수행한다.


옵션

-a, --archive : archive mode

디렉터리까지 동기화 복사(-r, --recursive)를 하며, 심볼릭 링크(-l, --link), 파일권한(-p, --perm), 사용자 및 그룹 소유자(-g & -o), 수정시간(-t, --times) 도 유지하며 동기화 복사를 한다.

-v : verbose, 자세한 정보 출력)

-z : 압축전송.


출처

http://en.wikipedia.org/wiki/Rsync

http://linux.die.net/man/1/rsync

http://www.tecmint.com/rsync-local-remote-file-synchronization-commands/



반응형
반응형

출처 : http://stackoverflow.com/questions/15691977/why-start-a-shell-command-with-a-backslash

왜 쉘 명령어가 \(백슬래시)로 시작하나요?

\curl -L https://get.rvm.io | bash -s stable

왜 이 명령어가 '\'로 시작하나요 ? 여기를 클릭하면 제가 본 사이트입니다.

2개의 답변

alias curl='curl --some --default --options'

만약 당신이 curl 이란 alias를 설정해 놓았고 이 alias를 사용하고 싶지 않다면 백슬래시를 넣음으로써 alias를 사용하게 않고 curl 바이너리를 직접 실행하도록 합니다.

이는 현재 사용중인 쉘(shell)에서만 적용됩니다. alias는 쉘 스크립트에서는 효과가 없기 때문에 거기엔 넣을 필요가 없습니다. 




 Bourne/POSIX 쉘 명세서는 says 현재 사용중인 쉘에서 alias 치환은 명령어가 인용에 사용하는 문자들이 있을 때 억제된다고 설명이 되어 있습니다. 백슬래시가 그 중 한 방법이고 작은 따옴표와 큰 따옴표를 통해 다른 알려진 방법으로 인용하는 방법도 있습니다. 다음 모두는 alias 치환을 억제할 것입니다.
 \curl
 cur\l
 \c\u\r\l
 "c"url
 "curl"
 "c""u""r""l"
 'curl'
 'cu'"rl"

 \curl 를 사용하는 것은 가장 보편적이고 읽기 쉬운 방법입니다. 이는 표준화된 특징이기 때문에 모든 Bourne 쉘에서 잘 작동할 수 있습니다.

반응형

'리눅스 shell' 카테고리의 다른 글

ssh를 사용하여 원격 컴퓨터의 shell script를 실행하는 방법?  (0) 2015.03.26
rsync  (0) 2015.02.17
fg  (0) 2011.08.03
iostat  (0) 2011.08.03
ntsysv  (0) 2011.07.12

+ Recent posts