반응형

출처
https://serverfault.com/questions/7689/how-do-i-get-rid-of-sockets-in-fin-wait1-state

FIN_WAIT1 상태를 소켓에서 어떻게 제거하나요?

kill이 필요한 프로세스에 의해 차단된 포트가 있습니다. (충돌한 telnet 대몬). 프로세스가 성공적으로 종료되었지만 포트는 여전히 'FIN_WAIT1' 상태입니다. 그것은 나오지 않으며, 그 시간 초과는 '십년'으로 설정된 것 같습니다.

포트를 해제할 수 있는 유일한 방법은 전체 시스템을 재부팅하는 것인데, 이는 당연히 하고 싶지 않은 일입니다.

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572 

리부팅 없이 블록되지 않도록 포트를 처리하는 방법에 대해 아시는 분 있나요?


9개의 답변 중 1개의 답변

# tcp_max_orphans의 현재 값을 기록
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#tcp_max_orphans를 임시로 0 으로 설정
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# /var/log/messages 확인
# 그것은 "kernel: TCP: too many of orphaned sockets"를 뱉어낼 것입니다.
# 접속이 없어지는 데 오래 걸리지 않을 것입니다. 

# 이전에 있던 tcp_max_orphans 의 값을 복구합니다.
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# 다음으로 검증합니다.
netstat -an|grep FIN_WAIT1
반응형
반응형

출처

https://stackoverflow.com/questions/11277432/how-can-i-remove-a-key-from-a-python-dictionary

Python dictionary에서 키를 어떻게 없앨 수 있을까요?

dictionary에서 키를 삭제할 때 저는 다음을 사용하였습니다.

if 'key' in my_dict:
    del my_dict['key']

이를 한 줄로 할 수 있는 방법이 있습니까?


16 개의 답변 중 1 개의 답변

dictionary에 키가 있는지 상관없이 삭제하려면, dict.pop()에서 2개의 인자를 사용합니다.

my_dict.pop('key', None)

이는 key가 dictionary에 존재한다면 my_dict[key]를 리턴할 것이며 그렇지 않으면 None을 리턴할 것입니다. 두 번째 파라미터가 특정되지 않았고 (예 my_dict.pop('key')) key가 존재하지 않으면 KeyError 오류가 발생합니다.

존재하는지 보장되는 키를 지우기 위해 다음을 사용할 수 있습니다.

del my_dict['key']

만약 dictionary에 키가 없으면 KeyError 오류가 발생합니다.

반응형
반응형

출처 : 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하면 그 공유메모리가 사라진 것을 확인하실 수 있습니다.

반응형

+ Recent posts