2008-10-08 9 views
0

J'ai une question peut-être quelqu'un ici peut m'aider. Si je fais "ps aux --sort user" sur la console Linux, j'ai une liste d'utilisateurs et leurs processus qui s'exécutent sur la machine. Ma question est de savoir comment puis-je supprimer le nom et l'impression des utilisateurs qui liste comme celle dans un programme C:C wrapper pour supprimer les utilisateurs sur la commande "ps"

par exemple:

(…) 
-------------------------------------------------------------------------- 
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 

(…) 

imprimer le nom d'utilisateur, puis imprimer ses processus ... des idées ?

thx

+0

Est-ce que je vous comprends bien: Vous voulez que la liste des processus soit groupée par les utilisateurs? –

Répondre

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

Ce n'est pas tout à fait exact, car \ w correspond à alphanumberics et underscore, mais d'autres caractères sont valides dans les noms d'utilisateur. En particulier, le trait d'union est très courant (par exemple www-data) –

0

Pas vraiment une réponse à votre question, mais les noms utilisateurs sont sensibles à la casse dans unix, afin de les capitaliser tout est sans doute pas une bonne idée. Si vous voulez les faire ressortir visuellement alors "USER: apache" serait mieux. En dehors de cela, la réponse de bmdhacks est bonne (mais pas tout à fait raison). Vous pourriez faire quelque chose de similaire dans awk, mais ce serait plutôt plus compliqué.

0

Cela devrait fonctionner:

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

Basé sur la réponse de bmdhacks, mais avec les correctifs suivants:

a) il compte une non-blancs dans le cadre du nom d'utilisateur, b) il supprime tout espace après le nom d'utilisateur, comme votre exemple de sortie avait, sinon les choses ne s'alignaient pas c) J'ai dû enlever le g pour le faire fonctionner. Je pense que, avec le g, il peut potentiellement correspondre beaucoup de fois, donc perl ne définit pas $ 1 car il pourrait être ambigu. d) Ajout de h à la commande ps afin qu'elle ne sorte pas d'en-tête.

+0

Pourquoi utiliser perl quand vous pouvez utiliser, disons, awk? –

+0

Je l'ai essayé dans awk et c'est plus compliqué. Possible, mais la version perl est beaucoup plus facile à lire, honnêtement. –

+0

Pourquoi ne pas l'essayer dans awk et le poster ici? Vous pourriez être mieux à awk que moi (très probablement!) Et je pense qu'une solution alternative est toujours intéressante. –

0

c'est la ligne de commande pour Linux pour faire ce que je dis ... mais ce n'est pas ce que je veux ... je veux faire cela dans un programme C ... Je dois écrire un programme C qui fait que ... donc j'utilise fork() pour créer un processus qui exécute ps aux --sort user ... et puis je veux avec un autre processus pour contrôler l'impression des processus et des utilisateurs ... sry, si j'explique mon problème rong.

La commande que je veux exécuter est la suivante: ps aux --sort utilisateur | sort_by_user ... cette option sort_by_user doesn.t existe .. Faire un processus en C pour exécuter cette commande est simple avec les commandes fork() et execlp(), mais créer une option à cette commande en C je n'ai pas de idées

+0

J'ai ajouté l'exigence "C programme" à votre question initiale, vous auriez vraiment dû inclure cette information pour commencer. –

1

Vous avez un certain nombre d'options en fonction de la quantité de celui-ci que vous voulez faire en C.

Le pour exécuter une commande shell système() est d'utiliser la plus simple (comme celui que je posté plus tôt) à fais le sort entier. system() va en fait générer un shell, donc des choses comme la redirection fonctionneront comme elles le font depuis la ligne de commande.

Si vous voulez éviter d'utiliser system(), vous pouvez le faire vous-même, en engendrant deux processus et en les reliant entre eux. Recherchez les tuyaux() et dup2(). Probablement une perte de temps.

Vous pouvez exécuter le programme ps et analyser sa sortie dans C. Encore une fois, pipe() et dup2() sont pertinents. Pour l'analyse réelle, je le ferais simplement en utilisant les routines normales de manipulation de chaînes C, car c'est vraiment très simple. Évidemment, vous pourriez utiliser une bibliothèque regex à la place, mais je pense que dans ce cas, il en résulterait un code plus compliqué que sans.

Bien sûr, vous pouvez faire tout le travail en C en regardant les fichiers dans/proc.

0

Utilisez popen et manipuler la chaîne de stdout dans votre programme C

0

Je résolu mon problème en redirigeant le stdout mis et le modifier.

Questions connexes