بگذارید کمی مقدمه چینی کنم تا به اصل قضیه برسم و اسکریپت مربوطه رو که حتی یک grep هم نداره توضیح بدم. تمام پراسسها در دایرکتوری /proc دارای یک دایرکتوری هستند با نام PID خودشون، که خیلی از منابع اون پراسس در اون داریکتوری ذخیره میشن. اگر برای اون پراسس حداقل یک متغیر محیطی ایجاد شده باشه، در همون دایرکتوری فایلی با نام environ ایجاد میشه. به مثال زیر توجه کنید، این مثال در مورد PID فرمان bash هست که کلی متغیر داره:
root@debian:/home/mohsen# cat /proc/4069/environ XDG_SESSION_ID=1GDM_LANG=en_US.UTF-8XDG_RUNTIME_DIR=/run/user/1000WINDOWID=12582915HOME=/home/mohsenCOLORTERM=gnome-terminalXDG_SESSION_DESKTOP=awesomeXDG_SEAT=seat0GDMSESSION=awesomeTERMINATOR_UUID=urn:uuid:95733c91-bae1-411a-836c-319c396ae06eDISPLAY=:0SSH_AGENT_PID=1698DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-ByJdbw3fby,guid=72312f1af7594f58d0d5a97954f28444_JAVA_AWT_WM_NONREPARENTING=1LOGNAME=mohsenLANG=en_US.UTF-8WINDOWPATH=7SSH_AUTH_SOCK=/tmp/ssh-npu3VnARRiwC/agent.1655TERM=xtermXDG_VTNR=7USERNAME=mohsenXAUTHORITY=/var/run/gdm3/auth-for-mohsen-CmoIle/databaseDESKTOP_SESSION=awesomeORBIT_SOCKETDIR=/tmp/orbit-mohsenPWD=/home/mohsenUSER=mohsenPATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/gamesSHELL=/bin/bashroot@debian:/home/mohsen# |
این هم از اسکریپت زیر:
#!/bin/bash # --value PATTERN -o PS_COMMAND_OPTIONS ##########investagiting argumens ###################### function help(){ echo "Usage: -h: help --help: help --velue PATTERN : specify a patern for looking for (mandatory) -o PS_COMMAND_OPTIONS: specifying a set of options for process management (mandatory)" } #############arg_process########################################## if [ "$1" = "--value" -a "$3" != "-o" -o "$1" != "--value" -a "$3" = "-o" -o ! $# -eq 4 ]; then help; exit; fi; ################################# for i in `ls -d /proc/*[0-9]*`; do number_of_used=`cat $i/environ 2> /dev/null | xargs -0 |awk -v e_v2=$2 'BEGIN{}{for (i = 0; i < NF; i++) print $i}' |awk -F= '{print $2}' |awk -v e_patt=$2 '{for (i = 0 ; i<NF; i++){if (match($1,e_patt)) num++;} }END{print num;}'` if [ ! -z $number_of_used ]; then echo -------------------Number of variables: $number_of_used------------------------------------------------------------------------------------------------------------------------- pid=`echo $i |awk -F/ '{print $3}'` header=`echo $4 |sed 's/,/ /g' ` echo $header ps_content=`ps --no-headers -p $pid -o $4 2> /dev/null` if [ $? -ne 0 ]; then help exit fi; echo $ps_content fi; done;
برای استفاده از آن میتوان از عبارت زیر استفاده کرد:
oot@debian:/home/mohsen/codes/grepenv# ./grepenv.sh –value pid -o cmd,user ——————-Number of variables: 1————————————- cmd user /usr/sbin/apache2 -k start root ——————-Number of variables: 1————————————- cmd user /usr/sbin/apache2 -k start www-data ——————-Number of variables: 1————————————- cmd user /usr/sbin/apache2 -k start www-data ——————-Number of variables: 1————————————- cmd user /usr/sbin/apache2 -k start www-data ——————-Number of variables: 1————————————- cmd user /usr/sbin/apache2 -k start www-data ——————-Number of variables: 1————————————-
cmd user /usr/sbin/privoxy –pidfile privoxy/ |
ارامتر اول یک عبارت برای جستجو میگیرد و پارامتر دوم همان option ها در فرمان ps هستند که برای شما نمایش داده شوند.درواقع این فرمان در کل سیستم میگردد و این عبارت را در کل متغیرهای محیطی جسجتو میکند و اما چه برگرداند:
۱. پراسس هایی که آن را استفاده کردهاند.
۲. تعداد استفاده آن پراسسها از این عبارت.
نکته: کد ساده است و شما خود میتوانید آن را به دلخواه و نیاز خود تغییر دهید.
تمرین: برای چگونگی استفاده این اسکریپت برای پارامتر value– نام کاربری خود را پاس نمایید.
نوشته grep در محتوای متغیرهای محیطی کل سیستم با یک اسکریپت ساده اولین بار در چرت و پرت پدیدار شد.