Форум сайта python.su
Если кто подскажет, буду крайне признателен)
Задача следующая - Приложение, обнаруживающее именованные каналы и локальные сокеты, не открытые ни одним процессом.
Теперь к тому что получилось)
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import glob import re from stat import * def get_process_name_by_pid(pid, onlyName=False): cmdLineFile = open('/proc/' + str(pid) + '/cmdline', 'r') cmdLine = cmdLineFile.readline() cmdLineFile.close() if onlyName: return os.path.split(cmdLine.split('\x00')[0])[1] else: return ''.join([(char if char != '\x00' else ' ') for char in cmdLine]) def get_pipes_in_proc(): pipesInProc = [] for path in glob.glob('/proc/[0-9]*/fd/*'): try: mode = os.stat(path).st_mode if S_ISFIFO(mode): pid = int(re.search('[0-9]+', path).group(0)) pipesInProc.append((get_process_name_by_pid(pid, True), path)) except: pass return pipesInProc def get_sockets_in_proc(): socketsInProc = [] for path in glob.glob('/proc/[0-9]*/fd/*'): try: mode = os.stat(path).st_mode if S_ISSOCK(mode): pid = int(re.search('[0-9]+', path).group(0)) socketsInProc.append((get_process_name_by_pid(pid, True), path)) except: pass return socketsInProc def get_pipes_in_fs(): ''' NOT WORK! ''' pipesInFS = [] for root, subFolders, fileNames in os.walk('/'): for fileName in fileNames: path = os.path.join(root, fileName) if path[0:6] == '/proc/': break try: mode = os.stat(path).st_mode if S_ISFIFO(mode): pid = int(re.search('[0-9]+', path).group(0)) pipesInFS.append((get_process_name_by_pid(pid, True), path)) except: pass return pipesInFS def pretty_print(l, tableName=''): maxPnLen = max([len(x[0]) for x in l]) print '============' + (maxPnLen - 8) * '=' + '====================' print ' ' + tableName print ' process name' + (maxPnLen - 8) * ' ' + 'path (symlink)' print '============' + (maxPnLen - 8) * '=' + '====================' for pn, path in l: print str(pn) + (maxPnLen - len(pn) + 4)*' ' + str(path) if __name__ == '__main__': pipes = get_pipes_in_proc() pretty_print(pipes, 'Pipes') sockets = get_sockets_in_proc() pretty_print(sockets, 'Sockets')
Офлайн
Может кто помочь? очень нужно
Офлайн
А можно поподробнее почему открытые пайпы должны быть непонятно где на файловой системе?
Офлайн
Ed
Задание такое ( По сути щас мало кто вообще использует пайпы…
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import subprocess from stat import * for root, subFolders, fileNames in os.walk('/'): for fileName in fileNames: path = os.path.join(root, fileName) if path[0:6] == '/proc/': break elif path[0:6] == '/host/': break try: mode = os.stat(path).st_mode if S_ISFIFO(mode): print path if subprocess.call('lsof | grep '+path, shell=True): print 'kill the pipe!!!' else: print 'all pipe have process' except: pass
Отредактировано Morkan (Апрель 4, 2012 23:15:10)
Офлайн
если заменить S_ISFIFO на S_ISSOCK то вроде что то выводит, но я не знаю правильно ли это? половину вроде как убить пишет, половину как ок
Офлайн
Мне кажется, что поиск по всей файловой системе - это конкретный оверкилл. Я гляну сорцы lsof, но навскидку он все это берет из /proc и /proc должно хватить для решения всей задачи. Кстати, это еще актуально или вы уже все порешали?
Офлайн