📄 procref1.html
字号:
WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="common/note.png"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>It is even possible to control certain peripherals with commands sent to the <TTCLASS="FILENAME">/proc</TT> directory. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="SCREEN"> <TTCLASS="PROMPT">root# </TT><BCLASS="COMMAND">echo on > /proc/acpi/ibm/light</B> </PRE></TD></TR></TABLE> This turns on the <SPANCLASS="emphasis"><ICLASS="EMPHASIS">Thinklight</I></SPAN> in certain models of IBM/Lenovo Thinkpads.</P><P>Of course, caution is advised when writing to <TTCLASS="FILENAME">/proc</TT>.</P></TD></TR></TABLE></DIV><P><ANAME="PROCRUNNING"></A></P><P>The <TTCLASS="FILENAME">/proc</TT> directory contains subdirectories with unusual numerical names. Every one of these names maps to the <AHREF="variables2.html#PPIDREF">process ID</A> of a currently running process. Within each of these subdirectories, there are a number of files that hold useful information about the corresponding process. The <TTCLASS="FILENAME">stat</TT> and <TTCLASS="FILENAME">status</TT> files keep running statistics on the process, the <TTCLASS="FILENAME">cmdline</TT> file holds the command-line arguments the process was invoked with, and the <TTCLASS="FILENAME">exe</TT> file is a symbolic link to the complete path name of the invoking process. There are a few more such files, but these seem to be the most interesting from a scripting standpoint.</P><DIVCLASS="EXAMPLE"><HR><ANAME="PIDID"></A><P><B>Example 27-2. Finding the process associated with a PID</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # pid-identifier.sh: 3 # Gives complete path name to process associated with pid. 4 5 ARGNO=1 # Number of arguments the script expects. 6 E_WRONGARGS=65 7 E_BADPID=66 8 E_NOSUCHPROCESS=67 9 E_NOPERMISSION=68 10 PROCFILE=exe 11 12 if [ $# -ne $ARGNO ] 13 then 14 echo "Usage: `basename $0` PID-number" >&2 # Error message >stderr. 15 exit $E_WRONGARGS 16 fi 17 18 pidno=$( ps ax | grep $1 | awk '{ print $1 }' | grep $1 ) 19 # Checks for pid in "ps" listing, field #1. 20 # Then makes sure it is the actual process, not the process invoked by this script. 21 # The last "grep $1" filters out this possibility. 22 # 23 # pidno=$( ps ax | awk '{ print $1 }' | grep $1 ) 24 # also works, as Teemu Huovila, points out. 25 26 if [ -z "$pidno" ] # If, after all the filtering, the result is a zero-length string, 27 then #+ no running process corresponds to the pid given. 28 echo "No such process running." 29 exit $E_NOSUCHPROCESS 30 fi 31 32 # Alternatively: 33 # if ! ps $1 > /dev/null 2>&1 34 # then # no running process corresponds to the pid given. 35 # echo "No such process running." 36 # exit $E_NOSUCHPROCESS 37 # fi 38 39 # To simplify the entire process, use "pidof". 40 41 42 if [ ! -r "/proc/$1/$PROCFILE" ] # Check for read permission. 43 then 44 echo "Process $1 running, but..." 45 echo "Can't get read permission on /proc/$1/$PROCFILE." 46 exit $E_NOPERMISSION # Ordinary user can't access some files in /proc. 47 fi 48 49 # The last two tests may be replaced by: 50 # if ! kill -0 $1 > /dev/null 2>&1 # '0' is not a signal, but 51 # this will test whether it is possible 52 # to send a signal to the process. 53 # then echo "PID doesn't exist or you're not its owner" >&2 54 # exit $E_BADPID 55 # fi 56 57 58 59 exe_file=$( ls -l /proc/$1 | grep "exe" | awk '{ print $11 }' ) 60 # Or exe_file=$( ls -l /proc/$1/exe | awk '{print $11}' ) 61 # 62 # /proc/pid-number/exe is a symbolic link 63 #+ to the complete path name of the invoking process. 64 65 if [ -e "$exe_file" ] # If /proc/pid-number/exe exists, 66 then #+ then the corresponding process exists. 67 echo "Process #$1 invoked by $exe_file." 68 else 69 echo "No such process running." 70 fi 71 72 73 # This elaborate script can *almost* be replaced by 74 # ps ax | grep $1 | awk '{ print $5 }' 75 # However, this will not work... 76 #+ because the fifth field of 'ps' is argv[0] of the process, 77 #+ not the executable file path. 78 # 79 # However, either of the following would work. 80 # find /proc/$1/exe -printf '%l\n' 81 # lsof -aFn -p $1 -d txt | sed -ne 's/^n//p' 82 83 # Additional commentary by Stephane Chazelas. 84 85 exit 0</PRE></TD></TR></TABLE><HR></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="CONSTAT"></A><P><B>Example 27-3. On-line connect status</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 3 PROCNAME=pppd # ppp daemon 4 PROCFILENAME=status # Where to look. 5 NOTCONNECTED=65 6 INTERVAL=2 # Update every 2 seconds. 7 8 pidno=$( ps ax | grep -v "ps ax" | grep -v grep | grep $PROCNAME | awk '{ print $1 }' ) 9 # Finding the process number of 'pppd', the 'ppp daemon'. 10 # Have to filter out the process lines generated by the search itself. 11 # 12 # However, as Oleg Philon points out, 13 #+ this could have been considerably simplified by using "pidof". 14 # pidno=$( pidof $PROCNAME ) 15 # 16 # Moral of the story: 17 #+ When a command sequence gets too complex, look for a shortcut. 18 19 20 if [ -z "$pidno" ] # If no pid, then process is not running. 21 then 22 echo "Not connected." 23 exit $NOTCONNECTED 24 else 25 echo "Connected."; echo 26 fi 27 28 while [ true ] # Endless loop, script can be improved here. 29 do 30 31 if [ ! -e "/proc/$pidno/$PROCFILENAME" ] 32 # While process running, then "status" file exists. 33 then 34 echo "Disconnected." 35 exit $NOTCONNECTED 36 fi 37 38 netstat -s | grep "packets received" # Get some connect statistics. 39 netstat -s | grep "packets delivered" 40 41 42 sleep $INTERVAL 43 echo; echo 44 45 done 46 47 exit 0 48 49 # As it stands, this script must be terminated with a Control-C. 50 51 # Exercises: 52 # --------- 53 # Improve the script so it exits on a "q" keystroke. 54 # Make the script more user-friendly in other ways.</PRE></TD></TR></TABLE><HR></DIV><P><ANAME="PROCWARNING"></A></P><DIVCLASS="WARNING"><TABLECLASS="WARNING"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="common/warning.png"HSPACE="5"ALT="Warning"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>In general, it is dangerous to <SPANCLASS="emphasis"><ICLASS="EMPHASIS">write</I></SPAN> to the files in <TTCLASS="FILENAME">/proc</TT>, as this can corrupt the filesystem or crash the machine.</P></TD></TR></TABLE></DIV></DIV><H3CLASS="FOOTNOTES">Notes</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN17612"HREF="procref1.html#AEN17612">[1]</A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>Certain system commands, such as <AHREF="system.html#PROCINFOREF">procinfo</A>, <AHREF="system.html#FREEREF">free</A>, <AHREF="system.html#VMSTATREF">vmstat</A>, <AHREF="system.html#LSDEVREF">lsdev</A>, and <AHREF="system.html#UPTIMEREF">uptime</A> do this as well.</P></TD></TR></TABLE><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="devproc.html"ACCESSKEY="P">Prev</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">Home</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="zeros.html"ACCESSKEY="N">Next</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><TTCLASS="FILENAME">/dev</TT> and <TTCLASS="FILENAME">/proc</TT></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="devproc.html"ACCESSKEY="U">Up</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">Of Zeros and Nulls</TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -