C оболочка для удаления пользователей по команде "ps" - PullRequest
0 голосов
/ 08 октября 2008

У меня есть один вопрос, может быть, кто-то здесь может мне помочь. Если я выполняю «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

(…)

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

1010 * ТНХ *

Ответы [ 7 ]

3 голосов
/ 08 октября 2008
ps aux --sort user | perl -npe 's/^(\w+)//g; if ($user ne $1) {$user=$1; print "user: " . uc($user) . "\n";}'
1 голос
/ 09 октября 2008

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

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

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

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

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

.
0 голосов
/ 10 октября 2008

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

0 голосов
/ 09 октября 2008

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

0 голосов
/ 09 октября 2008

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

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

0 голосов
/ 08 октября 2008

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

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

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

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

0 голосов
/ 08 октября 2008

Не совсем ответ на ваш вопрос, но имена пользователей чувствительны к регистру в Unix, поэтому использование их всех с большой буквы, вероятно, не очень хорошая идея. Если вы хотите, чтобы они выделялись визуально, тогда лучше использовать «USER: apache».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...