수면 과정을 죽일 수 없다


13

인터럽트 가능한 수면 (S) 상태에있는 프로세스를 죽일 수없는 것 같습니다.

[root@jupiter ~]# ps -elf | grep yum
4 S root     16790     1  0  75   0 - 73779 -      Jan15 ?        00:00:04 /usr/bin/python /usr/bin/yum -y install python-pip
[root@jupiter ~]# kill -9 16790
[root@jupiter ~]# ps -elf | grep yum
4 S root     16790     1  0  75   0 - 73779 -      Jan15 ?        00:00:04 /usr/bin/python /usr/bin/yum -y install python-pip

이것이 어떻게 가능한지? 재부팅하지 않고 프로세스를 종료 할 수있는 방법이 있습니까?

바운티 : 저는 이것이 어떻게 일어날 수 있는지에 대한 설명에 더 관심이 있습니다.

업데이트 : 이것은 lsof의 출력입니다.

[root @ jupiter ~] # lsof -p 16790
명령 PID 사용자 FD 유형 장치 크기 / 꺼짐 노드 이름
yum 16790 루트 cwd DIR 1166,56842 4096 16886249 / home / del
yum 16790 루트 rtd DIR 253,0 4096 2 /
yum 16790 루트 txt REG 253,0 8304 336177337 / usr / bin / python
yum 16790 루트 mem REG 253,0 144776 346128569 /lib64/ld-2.5.so
yum 16790 루트 mem REG 253,0 1718232 346128573 /lib64/libc-2.5.so
yum 16790 루트 mem REG 253,0 23360 346128599 /lib64/libdl-2.5.so
yum 16790 루트 mem REG 253,0 145872 346128584 /lib64/libpthread-2.5.so
yum 16790 루트 mem REG 253,0 615136 346128602 /lib64/libm-2.5.so
yum 16790 루트 mem REG 253,0 1244792 336171087 /usr/lib64/libpython2.4.so.1.0
yum 16790 루트 mem REG 253,0 95464 346128744 /lib64/libselinux.so.1
yum 16790 루트 mem REG 253,0 53448 346128750 /lib64/librt-2.5.so
yum 16790 루트 mem REG 253,0 13960 336187564 /usr/lib64/libplds4.so
yum 16790 루트 mem REG 253,0 58400 346128752 /lib64/libgcc_s-4.1.2-20080825.so.1
yum 16790 루트 mem REG 253,0 78384 336173796 /usr/lib64/libelf-0.137.so
yum 16790 루트 mem REG 253,0 1139672 336187570 /usr/lib64/librpmdb-4.4.so
yum 16790 루트 mem REG 253,0 407792 336187568 /usr/lib64/librpmio-4.4.so
yum 16790 루트 mem REG 253,0 233144 336171420 /usr/lib64/libnspr4.so
yum 16790 루트 mem REG 253,0 375656 336187569 /usr/lib64/libsqlite3.so.0.8.6
yum 16790 루트 mem REG 253,0 17992 336187563 /usr/lib64/libplc4.so
yum 16790 루트 mem REG 253,0 386784 336187571 /usr/lib64/librpm-4.4.so
yum 16790 루트 mem REG 253,0 154776 336170228 /usr/lib64/librpmbuild-4.4.so
yum 16790 루트 mem REG 253,0 647608 346128759 /lib64/libglib-2.0.so.0.1200.3
yum 16790 루트 mem REG 253,0 1297136 336176959 /usr/lib64/libxml2.so.2.6.26
yum 16790 루트 mem REG 253,0 15584 346128756 /lib64/libtermcap.so.2.0.8
yum 16790 루트 mem REG 253,0 1234328 336187566 /usr/lib64/libnss3.so
yum 16790 루트 mem REG 253,0 18152 346128670 /lib64/libutil-2.5.so
yum 16790 루트 mem REG 253,0 34240 336177071 /usr/lib64/libpopt.so.0.0.0
yum 16790 루트 mem REG 253,0 67792 336187567 /usr/lib64/libbz2.so.1.0.3
yum 16790 루트 mem REG 253,0 143144 346128763 /lib64/libexpat.so.0.5.0
yum 16790 루트 mem REG 253,0 56434416 336184082 / usr / lib / locale / locale-archive
yum 16790 루트 mem REG 253,0 132656 336560181 /usr/lib64/python2.4/site-packages/rpm/_rpmmodule.so
yum 16790 루트 mem REG 253,0 154016 336187565 /usr/lib64/libnssutil3.so
yum 16790 루트 mem REG 253,0 96885 345638632 /usr/local/greenplum-loaders-3.3.0.0-build-3/lib/libz.so.1.2.3
yum 16790 루트 mem REG 253,0 247496 346128741 /lib64/libsepol.so.1
yum 16790 루트 mem REG 253,0 369144 336168883 /usr/lib64/libsoftokn3.so
yum 16790 루트 mem REG 253,0 312336 336178453 /usr/lib64/libfreebl3.so
yum 16790 루트 mem REG 253,0 20240 336530067 /usr/lib64/python2.4/lib-dynload/timemodule.so
yum 16790 루트 mem REG 253,0 25048 336529953 /usr/lib64/python2.4/lib-dynload/stropmodule.so
yum 16790 루트 mem REG 253,0 18984 336530051 /usr/lib64/python2.4/lib-dynload/cStringIO.so
yum 16790 루트 mem REG 253,0 21816 336529943 /usr/lib64/python2.4/lib-dynload/collectionsmodule.so
yum 16790 루트 mem REG 253,0 52152 336530044 /usr/lib64/python2.4/lib-dynload/_socketmodule.so
yum 16790 루트 mem REG 253,0 17200 336530045 /usr/lib64/python2.4/lib-dynload/_ssl.so
yum 16790 루트 mem REG 253,0 315080 346128749 /lib64/libssl.so.0.9.8e
yum 16790 루트 mem REG 253,0 1366912 346128748 /lib64/libcrypto.so.0.9.8e
yum 16790 루트 mem REG 253,0 190976 336187552 /usr/lib64/libgssapi_krb5.so.2.2
yum 16790 루트 mem REG 253,0 613928 336184245 /usr/lib64/libkrb5.so.3.3
yum 16790 루트 mem REG 253,0 11760 346128747 /lib64/libcom_err.so.2.1
yum 16790 루트 mem REG 253,0 153720 336181723 /usr/lib64/libk5crypto.so.3.1
yum 16790 루트 mem REG 253,0 35984 336177832 /usr/lib64/libkrb5support.so.0.1
yum 16790 루트 mem REG 253,0 9472 346128681 /lib64/libkeyutils-1.2.so
yum 16790 루트 mem REG 253,0 92816 346128730 /lib64/libresolv-2.5.so
yum 16790 루트 mem REG 253,0 75384 336530050 /usr/lib64/python2.4/lib-dynload/cPickle.so
yum 16790 루트 mem REG 253,0 23736 336530064 /usr/lib64/python2.4/lib-dynload/structmodule.so
yum 16790 루트 mem REG 253,0 27336 336528958 /usr/lib64/python2.4/lib-dynload/operator.so
yum 16790 루트 mem REG 253,0 21520 336529958 /usr/lib64/python2.4/lib-dynload/zlibmodule.so
yum 16790 루트 mem REG 253,0 37944 336528952 /usr/lib64/python2.4/lib-dynload/itertoolsmodule.so
yum 16790 루트 mem REG 253,0 21528 336528929 /usr/lib64/python2.4/lib-dynload/_localemodule.so
yum 16790 루트 mem REG 253,0 21208 336529939 /usr/lib64/python2.4/lib-dynload/binascii.so
yum 16790 루트 mem REG 253,0 12080 336530062 /usr/lib64/python2.4/lib-dynload/shamodule.so
yum 16790 루트 mem REG 253,0 13168 336530058 /usr/lib64/python2.4/lib-dynload/md5module.so
yum 16790 루트 mem REG 253,0 18000 336529947 /usr/lib64/python2.4/lib-dynload/mathmodule.so
yum 16790 루트 mem REG 253,0 12504 336529934 /usr/lib64/python2.4/lib-dynload/_randommodule.so
yum 16790 루트 mem REG 253,0 15320 336528948 /usr/lib64/python2.4/lib-dynload/fcntlmodule.so
yum 16790 루트 mem REG 253,0 32816 336530049 /usr/lib64/python2.4/lib-dynload/bz2.so
yum 16790 루트 mem REG 253,0 8608 336529946 /usr/lib64/python2.4/lib-dynload/grpmodule.so
yum 16790 루트 mem REG 253,0 38696 336529819 /usr/lib64/python2.4/site-packages/cElementTree.so
yum 16790 루트 mem REG 253,0 42672 336530047 /usr/lib64/python2.4/lib-dynload/arraymodule.so
yum 16790 루트 mem REG 253,0 9368 336528915 /usr/lib64/python2.4/lib-dynload/_bisect.so
yum 16790 루트 mem REG 253,0 74992 336529944 /usr/lib64/python2.4/lib-dynload/datetime.so
yum 16790 루트 mem REG 253,0 372912 336560510 /usr/lib64/python2.4/site-packages/M2Crypto/__m2crypto.so
yum 16790 루트 mem REG 253,0 7120 336529937 /usr/lib64/python2.4/lib-dynload/_weakref.so
yum 16790 루트 mem REG 253,0 17496 336528966 /usr/lib64/python2.4/lib-dynload/selectmodule.so
yum 16790 루트 mem REG 253,0 46448 336528961 /usr/lib64/python2.4/lib-dynload/pyexpat.so
yum 16790 루트 mem REG 253,0 33896 336529820 /usr/lib64/python2.4/site-packages/_sqlite.so
yum 16790 루트 mem REG 253,0 41784 336530075 /usr/lib64/python2.4/site-packages/_sqlitecache.so
yum 16790 루트 mem REG 253,0 25104 336530066 /usr/lib64/python2.4/lib-dynload/termios.so
yum 16790 루트 mem REG 253,0 7280 336530065 /usr/lib64/python2.4/lib-dynload/syslog.so
yum 16790 루트 mem REG 253,0 25464 336265457 /usr/lib64/gconv/gconv-modules.cache
yum 16790 루트 mem REG 253,0 66544 336528926 /usr/lib64/python2.4/lib-dynload/_cursesmodule.so
yum 16790 루트 mem REG 253,0 380336 336181932 /usr/lib64/libncurses.so.5.5
yum 16790 루트 mem REG 253,0 405880 336529957 /usr/lib64/python2.4/lib-dynload/unicodedata.so
yum 16790 루트 mem REG 253,0 24576 236520047 /var/lib/rpm/__db.001
yum 16790 루트 mem REG 253,0 53880 346128424 /lib64/libnss_files-2.5.so
yum 16790 루트 mem REG 253,0 23736 346128408 /lib64/libnss_dns-2.5.so
yum 16790 루트 mem REG 253,0 1318912 236520050 /var/lib/rpm/__db.002
yum 16790 루트 mem REG 253,0 663552 236520051 /var/lib/rpm/__db.003
yum 16790 루트 mem REG 253,0 769074 336174965 /usr/share/locale/en_US/LC_MESSAGES/redhat-dist.mo
yum 16790 루트 0u CHR 136,8 0t0 10 / dev / pts / 8 (삭제됨)
yum 16790 루트 1u CHR 136,8 0t0 10 / dev / pts / 8 (삭제됨)
yum 16790 루트 2u CHR 136,8 0t0 10 / dev / pts / 8 (삭제됨)
m 16790 루트 3u 유닉스 0xffff8104388d2e40 0t0 4675113 소켓
yum 16790 루트 4w REG 253,0 236522326 /var/log/yum.log
yum 16790 루트 5u REG 253,0 605184 236520025 /var/cache/yum/WANdisco-dev/primary.xml.gz.sqlite
yum 16790 루트 6u REG 253,0 20480 236524002 /var/cache/yum/addons/primary.sqlite.old.tmp (삭제됨)
yum 16790 루트 7u REG 253,0 12578816 236519970 /var/cache/yum/base/primary.xml.gz.sqlite.old.tmp (삭제됨)
yum 16790 루트 8u REG 253,0 17972224 236523993 /var/cache/yum/epel/317109b44f1b0b40d910dc60c9080e62c7f4b16a-primary.sqlite.old.tmp (삭제됨)
yum 16790 루트 9u REG 253,0 967680 236524055 /var/cache/yum/extras/primary.sqlite.old.tmp (삭제됨)
yum 16790 루트 10u REG 253,0 459776 246415366 /var/cache/yum/pgdg92/primary.sqlite.old.tmp (삭제됨)
yum 16790 루트 11u REG 253,0 4927488 236524060 /var/cache/yum/updates/primary.sqlite.old.tmp (삭제됨)
yum 16790 루트 12r REG 253,0 65204224 236519434 / var / lib / rpm / 패키지
yum 16790 루트 13r REG 253,0 45056 236519438 / var / lib / rpm / Name
yum 16790 루트 14u IPv4 4675317 0t0 TCP jupiter.example.com:33597->riksun.riken.go.jp:http (ESTABLISHED)
yum 16790 루트 15u IPv4 4675939 0t0 TCP jupiter.example.com:52708->freedom.itsc.cuhk.edu.hk:http (CLOSE_WAIT)
yum 16790 루트 16r REG 253,0 65204224 236519434 / var / lib / rpm / 패키지
yum 16790 루트 17r REG 253,0 45056 236519438 / var / lib / rpm / 이름
yum 16790 루트 18r REG 253,0 12288 236519440 / var / lib / rpm / Pubkeys
m 16790 루트 20r FIFO 0,6 0t0 4676024 파이프
m 16790 루트 24w FIFO 0,6 0t0 4676024 파이프

동일한 잠금을 조작하는 다른 프로세스를 종료하면 문제가 해결 될 수 있습니다.
David Schwartz

@David-위의 프로세스 목록에서 yum 프로세스를 죽일 수 없습니다. 그들은 모두 같은 문제가 있습니다.
del

더 이상 정보를 추가하지 않았고 게시물을 읽기가 더 어려워 추가 줄을 삭제했습니다.
terdon

@slm-lsof는 riksun.riken.go.jp:80(ESTABLISHED) 및 freedom.itsc.cuhk.edu.hk:80(CLOSE_WAIT)에 대한 TCP 소켓을 보여줍니다. 그럴 수있을 것 같아?
del

@slm-업데이트 된 질문을 참조하십시오.
del

답변:


18

S 또는 D 상태의 프로세스는 일반적으로 파일 또는 네트워크에 대한 읽기 또는 쓰기, 호출 된 프로그램의 완료 대기 또는 세마포어 또는 기타 동기화 기본 요소 대기와 같은 블로킹 시스템 호출에 있습니다. 기다리는 동안 절전 상태가됩니다.

"깨워"수 없습니다. 대기중인 데이터 / 리소스를 사용할 수있을 때만 진행됩니다. 이것은 모두 정상이며 예상 된 것이며, 죽이려고 할 때만 문제가됩니다.

strace -p pid프로세스 pid에 대해 현재 어떤 시스템 호출이 일어나고 있는지 알아 내기 위해 시도하고 사용할 수 있습니다 .

에서 위키 피 디아 :

무정전 절전 상태는 신호를 즉시 처리하지 않는 절전 상태입니다. 대기중인 자원이 사용 가능해 지거나 대기 중 시간 종료가 발생한 후 (잠자기 상태에서 지정된 경우)에만 깨워집니다. 주로 디스크 또는 네트워크 IO (입력 / 출력)를 기다리는 장치 드라이버가 사용합니다. 프로세스가 중단없이 휴면 상태 인 경우 프로세스가 시스템 호출 또는 트랩에서 복귀하면 휴면 중에 누적 된 신호가 나타납니다.

시스템 호출에서 차단 된 프로세스는 무정전 절전 모드에 있으며 이름에서 알 수 있듯이 루트조차도 실제로 무정전입니다.

일반적으로 프로세스는 SIGKILL을 차단할 수 없습니다. 그러나 커널 코드는 시스템 호출을 호출 할 때 커널 코드를 실행할 수 있으며 프로세스는 커널 코드가 모든 신호를 차단합니다. 따라서 시스템 호출이 무기한 차단되는 경우 프로세스를 효과적으로 종료 할 수있는 방법이 없을 수 있습니다. SIGKILL은 프로세스가 시스템 호출을 완료 할 때마다 적용됩니다.


2
무정전 수면 프로세스 만 SIGKILL을 차단할 수 있다고 생각했습니다. 인터럽트 가능한 수면 프로세스도 가능합니까? 그렇다면 차이점은 무엇입니까?
del

1
S와 D 상태는 사실상 커널에서 프로그램하기에 너무 복잡하고 과거에는 매우 짧은 기간으로되어 있었기 때문에 중단 할 수 없습니다. 커널이 NFS 및 훨씬 더 오래 걸릴 수있는 다른 경우를 포함하도록 발전했지만, 커널 차단 대기는 불행히도 폐지되지 않았습니다.
harrymc

3
흥미 롭군 이것에 대한 언급이 있습니까? Google에서 찾을 수있는 모든 것은 인터럽트 가능한 프로세스가 SIGKILL을 무시할 수 없어야한다고 말합니다.
del

1
방해 할 수없는 수면에 대해 읽은 모든 내용과 모순되는 것 같습니다. 예를 들어 다음 2 개의 링크를 확인하십시오. 내가 뭔가를 오해하고 있습니까? (1) "인터럽터 블 휴면 상태에서 신호 처리를 위해 프로세스를 깨울 수있다." (2) "이 상태에서 프로세스에 대해 신호가 생성되면 작업이 중단되고 신호 전달에 의해 프로세스가 해제됩니다."
del

1
시스템 호출은 프로그램 방식에 따라 중단되거나 중단되지 않습니다. 일단 커널 안에 있으면 모든 것이 진행됩니다.
harrymc

10

수면 과정에 대한 배경

이 유닉스 및 리눅스 게시물을 살펴볼 수 있습니다.

특히이 답변은 /unix//a/5648/7453 입니다.

그 게시물에서 발췌

프로세스를 강제 종료 할 권한이있는 경우 kill -9 (SIGKILL)가 항상 작동합니다. 기본적으로 프로세스는 setuid 또는 setgid가 아니어야 시작하거나 루트 여야합니다. 한 가지 예외가 있습니다. root조차도 치명적인 신호를 PID 1 (초기 프로세스)에 보낼 수 없습니다.

그러나 kill -9는 즉시 작동하지 않을 수 있습니다. SIGKILL을 포함한 모든 신호는 비동기식으로 전달됩니다. 커널이 신호를 전달하는 데 시간이 걸릴 수 있습니다. 일반적으로 신호를 전달하는 데 최대 몇 마이크로 초가 걸리며, 대상이 시간 조각을 얻는 데 걸리는 시간입니다. 그러나 대상이 신호를 차단 한 경우 대상이 차단을 해제 할 때까지 신호가 대기됩니다.

일반적으로 프로세스는 SIGKILL을 차단할 수 없습니다. 그러나 커널 코드는 시스템 호출을 호출 할 때 커널 코드를 실행할 수 있으며 프로세스는 커널 코드를 실행합니다. 커널 호출은 시스템 호출을 방해 할 때 모든 신호를 차단하여 커널 어딘가에 데이터 구조가 잘못 형성되거나,보다 일반적으로 일부 커널 불변이 위반 될 수 있습니다. 따라서 (버그 또는 잘못된 디자인으로 인해) 시스템 호출이 무기한으로 차단되면 프로세스를 종료시킬 수있는 방법이 사실상 없을 수 있습니다. 그러나 시스템 호출이 완료되면 프로세스가 종료됩니다.

...

...

나는 그 대답의 나머지 부분을 읽는 것이 좋습니다!

리소스 (파일 또는 네트워크)에 의해 차단 된 프로세스 종료

시도해야 할 두 가지가 있습니다.

1. yum의 .pid 파일 제거

m 잠금 파일이 있습니까? 해당 잠금 파일을 제거하면 어떻게됩니까? 나는 그것이 진행될 수 있다고 생각합니다.

rm /var/run/yum.pid

2. 걸려있는 CLOSE_WAITTCP 연결 강제 종료

A CLOSE_WAIT는 다음과 같이 설명됩니다.

CLOSE_WAIT 서버가 클라이언트로부터 첫 번째 FIN 신호를 받았으며 연결이 종료되고 있음을 나타냅니다.

따라서 이것은 본질적으로 소켓이 애플리케이션이 close () 실행을 기다리는 상태임을 의미합니다.

소켓은 애플리케이션이 닫힐 때까지 무기한 CLOSE_WAIT 상태에있을 수 있습니다. 잘못된 시나리오는 파일 설명자 유출과 같으며 서버가 소켓에서 close ()를 실행하지 않아 close_wait 소켓이 쌓이게됩니다.

참고 : technet 웹 사이트 에서 발췌 .

이를 위해 두 가지 도구를 사용할 수 있습니다.

이러한 도구 는 TCP 연결을 완전히 닫는 데 필요한 FIN-ACK-RST 교환을 시뮬레이션하여 작동합니다 .

Killcx는 가짜 SeqNum으로 가짜 SYN 패킷을 생성하여 원격 클라이언트 IP / 포트를 스푸핑하여 서버로 보냅니다. 서버 응답을 캡처하고 ACK 패킷에서 2 개의 마법 값을 추출하고이를 사용하여 스푸핑 된 RST 패킷을 보내는 하위 프로세스를 분기합니다. 연결이 닫힙니다.

참고 : Killcx 웹 사이트 에서 발췌 .

커터 사용

주어진 두 IP / 포트 번호 쌍 사이의 특정 연결을 끊습니다.

# cutter ip-address-1 port-1 ip-address-2 port-2
% cutter 200.1.2.3 22 10.10.0.45 32451

Killcx 사용

원격 IP 및 포트에 대한 연결을 끊습니다.

# killcx remote-ip-address:port
% killcx 120.121.122.123:1234

자원


잠금 파일을 제거해도 효과가 없습니다.
del

1
이것은 프로덕션 시스템에 있으며 불행히도이 두 도구에는 설치할 수없는 종속성이 있습니다. /etc/init.d/networking restart를 시도했지만 아무것도하지 않았습니다. 실제로, 나는이 문제를 어떻게 해결할 수 있는지가 아니라 왜 인터럽트 가능한 수면 프로세스가 SIGKILL을 무시할 수 없다고 생각했기 때문에 왜 이런 일이 발생할 수 있는지 이해하는 데 더 관심이 있습니다.
del

네트워크를 다시 시작하면 동일한 효과가 있으므로 실제로 프로세스가 대기중인 I / O 차단은 다른 곳에 있습니다.
slm

1

부모 프로세스를 죽일 수 있습니다. ps를 사용하여 확인하십시오.

ps xjf -C yum

그런 다음 kill -9모든 부모 프로세스.


부모 프로세스는 init (내 출력의 다섯 번째 열)입니다.
del

1

strace를 사용하여 프로세스에 연결하여 실제로 유휴 상태인지 또는 IO 작업을 고수했는지 확인하는 것이 좋습니다. 아마도이 문제에 대한 추가 힌트를 제공 할 수 있습니다.

strace -pPID

내가 읽은 것부터이 프로세스를 재부팅하는 것 외에는 죽일 방법이 없습니다. 프로세스가 눈에 띄는 CPU 시간을 소비하지 않으면 서버에 부정적인 영향을 미치지 않을 것입니다.


제안 해 주셔서 감사하지만 부모 프로세스는 init입니다 (내 출력의 다섯 번째 열 참조).
del

수정 된 답변을 다시 보내면 strace는 프로세스에 첨부되지만 아무것도 출력하지 않습니다.
del

1

자식 프로세스를 기다리는 것일 수 있습니까? 나는 ps faux그것이 자식 프로세스가 있는지 여부와 당신이 죽여야 할 수도 있는지를 알려줄 것이기 때문에 사랑 합니다.


아니요,이 프로세스에는 자식 프로세스가 없습니다.
del
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.