Почему я не могу убить процесс SL?

Чтобы понять непропорциональное использование дискового пространства, часто бывает полезно начать с корневого каталога и пройти через некоторые из его самых больших дочерних директорий.

Мы можем сделать это,

  • сохранив вывод du в файл
  • итеративно просматривая результат

То есть:

# sum up the size of all files and directories under the root filesystem
du -a -h -x / > disk_usage.txt
# display the size of root items
grep $'\t/[^/]*$' disk_usage.txt

теперь допустим, что / usr кажется слишком большим

# display the size of /usr items
grep $'\t/usr/[^/]*$' disk_usage.txt

теперь, если / usr / local подозрительно большой

# display the size /usr/local items
grep $'\t/usr/local/[^/]*$' disk_usage.txt

и так далее ...

5
05.11.2018, 15:15
2 ответа

По умолчанию kill отправляет только сигнал TERM, по какой-то причине pcmanfmигнорирует этот сигнал. Если вы передадите опцию -KILL to kill, то она пошлет сигнал планировщику, и процесс будет удален без возможности очистки -или апелляции.

Вам не нужны дополнительные привилегии (sudo), чтобы убивать процессы, которыми вы владеете. sudoможет быть опасным, не используйте его только из-за разочарования.

17
27.01.2020, 20:31

kill по умолчанию отправляет SIGTERM. Это обрабатывается обработчиком сигналов процесса, и процесс может:

  • установить обработчик сигналов, который просто ничего не делает
  • игнорировать сигнал
  • замаскировать сигнал (и доставить его после демаскирования)

Думаю, что pcmanfmделает что-то подобное. Вы можете найти последние два, просмотрев /proc/PID/status, SigBlkи SigIgn

.

SIGKILL (9 ), с другой стороны, не обрабатывается самим процессом, и его обработчик сигнала не может быть изменен, проигнорирован или замаскирован.

Попробуйте запустить эту программу python3 с идентификатором процесса pcmanfn, чтобы увидеть, что именно она игнорирует или блокирует (для python 3.5):

#!/usr/bin/python3

import os
import sys
import time
import signal

def show(label, value):
    ivalue = int(value, 16)
    print("%s: %s:"% (label, value.strip()), end=' ')
    cnt=1
    while ivalue:
        if ivalue & 1:
            print("%s(%s)" % (signal.Signals(cnt).name, cnt), end=' ')
        ivalue>>=1
        cnt+=1
    print()

if len(sys.argv)==1:
    pid=os.getpid()
else:
    pid=int(sys.argv[1])

status=open('/proc/%d/status' % (pid,)).readlines()
print("Pid: %d" % (pid,))
for line in status:
    what, value = line.split(':', 1)
    if what=='SigBlk':
        show('Blocked', value)
    elif what=='SigIgn':
        show('Ignored', value)

Вы должны увидеть, есть ли там SIGTERM.

4
27.01.2020, 20:31

Теги

Похожие вопросы