C-оболочка для удаления пользователей по команде ps

У меня есть один вопрос, может быть, кто-то здесь может мне помочь. Если я делаю «ps aux --sort user» на консоли Linux, у меня есть один список пользователей и их процессов, запущенных на машине. Мой вопрос заключается в том, как удалить имя пользователя и распечатать этот список следующим образом в программе C:

Например:

(…)
--------------------------------------------------------------------------
user: APACHE
--------------------------------------------------------------------------
3169 0.0 1.2 39752 12352 ? S 04:10 0:00 /usr/sbin/httpd
--------------------------------------------------------------------------
user: VASCO
--------------------------------------------------------------------------
23030 0.0 0.1 4648 1536 pts/1 Ss 20:02 0:00 –bash

(…)

Я печатаю имя пользователя, затем печатаю его процессы... есть идеи?

спасибо


person Community    schedule 08.10.2008    source источник
comment
Я правильно вас понимаю: вам нужен список процессов, сгруппированных по пользователям?   -  person Andre Bossard    schedule 08.10.2008


Ответы (7)


У вас есть несколько вариантов в зависимости от того, сколько вы хотите сделать на C.

Самый простой способ — использовать system() для запуска команды оболочки (например, той, которую я опубликовал ранее), чтобы сделать всю партию. system() на самом деле создаст оболочку, поэтому такие вещи, как перенаправление, будут работать так же, как и из командной строки.

Если вы хотите избежать использования system(), вы можете сделать это самостоятельно, создав два процесса и связав их вместе. Найдите pipe() и dup2(). Наверное, пустая трата времени.

Вы можете запустить программу ps и проанализировать ее вывод на C. Опять же, pipe() и dup2() имеют значение. Для фактического синтаксического анализа я бы просто сделал это, используя обычные процедуры обработки строк C, так как это действительно довольно просто. Очевидно, вместо этого вы могли бы использовать библиотеку регулярных выражений, но я думаю, что в этом случае это приведет к более сложному коду, чем без нее.

Конечно, вы могли бы сделать все на C, просматривая файлы в /proc.

person Mark Baker    schedule 09.10.2008

На самом деле это не ответ на ваш вопрос, но имена пользователей чувствительны к регистру в unix, поэтому использовать их все с заглавной буквы, вероятно, не очень хорошая идея. Если вы хотите, чтобы они выделялись визуально, лучше использовать «ПОЛЬЗОВАТЕЛЬ: apache».

Кроме того, ответ bmdhacks хорош (но не совсем прав). Вы могли бы сделать что-то подобное в awk, но это было бы намного сложнее.

person Mark Baker    schedule 08.10.2008

Это должно работать:

ps haux --sort user | perl -npe 's/^(\S+)\s+//; if ($user ne $1) {$user=$1; print "user: " . uc($user) . "\n";}'

На основе ответа bmdhacks, но со следующими исправлениями:

а) он считает любое непробельное пространство частью имени пользователя, б) удаляет все пробелы после имени пользователя, как в вашем примере, иначе все не выровнялось бы в) мне пришлось удалить g, чтобы получить его работать. Я думаю, потому что с g он потенциально может совпадать много раз, поэтому perl не устанавливает $1, поскольку это может быть двусмысленно. г) В команду ps добавлено h, чтобы она не выводила заголовок.

person Mark Baker    schedule 08.10.2008
comment
Зачем использовать Perl, если можно использовать, скажем, awk? - person Nick Stinemates; 09.10.2008
comment
Я пробовал это в awk, и это сложнее. Возможно, но, честно говоря, Perl-версию намного легче читать. - person Mark Baker; 09.10.2008
comment
Почему бы не попробовать это в awk и не опубликовать здесь? Возможно, вы лучше разбираетесь в awk, чем я (очень вероятно!), и я думаю, что альтернативное решение всегда интересно. - person Mark Baker; 09.10.2008

это командная строка для Linux, чтобы сделать то, что я сказал... но это не то, что я хочу... я хочу сделать это в какой-нибудь программе на C... мне нужно написать программу на C, которая делает это... поэтому я использую fork (), чтобы создать один процесс, который выполняет ps aux --sort user... а затем я хочу, чтобы другой процесс контролировал печать процессов и пользователей... извините, если я объясню свою проблему.

Команда, которую я хочу запустить, выглядит так: ps aux --sort user | sort_by_user... этой опции sort_by_user не существует.. Создайте некоторый процесс в C для запуска этой команды, это просто с помощью команд fork() и execlp(), но создайте какую-либо опцию для этой команды в C, у меня нет никаких идеи.

person Community    schedule 09.10.2008
comment
Я добавил требование программы C к вашему исходному вопросу, вам действительно следовало включить эту информацию для начала. - person Adam Bellaire; 09.10.2008

Используйте popen и манипулируйте перенаправленной строкой stdout в вашей программе C

person Community    schedule 09.10.2008

Я решил свою проблему, перенаправив стандартный вывод и отредактировав его.

person Community    schedule 10.10.2008

person    schedule
comment
Это не совсем так, потому что \w соответствует буквенно-цифровым символам и знаку подчеркивания, но другие символы допустимы в именах пользователей. В частности, дефис очень распространен (например, www-данные) - person Mark Baker; 08.10.2008