Source: https://www.oracle.com/technetwork/es/articles/linux/part4-091721-esa.html
Timestamp: 2020-06-03 23:27:19+00:00

Document:
Guía para Maestría Avanzada en Comandos Linux, Parte 4: Administración del Entorno Linux
En esta serie, sepa cómo administrar el entorno Linux de manera efectiva a través de estos comandos ampliamente utilizados.
El comando ifconfig muestra los detalles de la/s interfaz/interfaces de red definidas en el sistema. La opción más común es -a , lo cual permite mostrar todas las interfaces.
El nombre usual de la interfaz de red Ethernet primaria es eth0. Para encontrar los detalles de una interfaz específica, por ej., eth0, puede utilizar:
A continuación se muestra el output con su respectiva explicación:
Éstas son algunas partes claves del output:
Link encap: corresponde al tipo de medio de hardware físico soportado por esta interfaz (Ethernet, en este caso)
HWaddr: es el identificador exclusivo de la tarjeta NIC. Cada tarjeta NIC tiene un identificador exclusivo asignado por el fabricante, denominado MAC o dirección MAC. La dirección de IP se adjunta al MAC del servidor. Si esta dirección de IP cambia, o esta tarjeta se mueve desde este servidor a otro, el MAC continúa siendo el mismo.
Mask: corresponde a la máscara de red
inet addr: es la dirección de IP que se adjunta a la interfaz
RX packets: se refiere a la cantidad de paquetes recibidos por esta interfaz
TX packets: se refiere a la cantidad de paquetes enviados
errors: es la cantidad de errores de envío y recepción
El comando no se utiliza solamente para controlar los parámetros; también se utiliza para configurar y administrar la interfaz. A continuación presentamos un breve listado de los parámetros y opciones de este comando:
up/down – activa o desactiva una interfaz específica. Usted puede utilizar el parámetro down para desconectar una interfaz (o desactivarla):
De manera similar, para conectarla (o activarla), usted debería utilizar:
media – establece el tipo de medio Ethernet como 10baseT, 10 Base 2, etc. Los valores comunes para el parámetro de medios son 10base2, 10baseT, y AUI. Si usted desea que Linux detecte el medio automáticamente, puede especificar “auto”, como se muestra a continuación:
add – establece una dirección de IP específica para la interfaz. Para determinar una dirección de IP 192.168.1.101 para la interfaz eth0, usted debería emitir lo siguiente:
netmask – determina el parámetro de máscara de red de la interfaz. A continuación se presenta un ejemplo en dónde puede establecer la máscara de red de la interfaz eth0 en 255.255.255.0
En un entorno Oracle Real Application Clusters usted debe establecer la máscara de red en cierto modo, utilizando este comando.
En algunas configuraciones avanzadas, usted puede cambiar la dirección de MAC asignada a la interfaz de red. El parámetro hw lo hace posible. El formato general es:
ifconfig <Interface> hw <TypeOfInterface>  <MAC>
<TypeOfInterface> muestra el tipo de interfaz, por ej., ether, para Ethernet. Aquí se muestra cómo la dirección MAC ha cambiado para eth0 a 12.34.56.78.90.12 (Nota: la dirección MAC que aquí se muestra es ficticia. En caso de ser igual a otra MAC real, es pura coincidencia):
Esto es útil cuando usted agrega una nueva tarjeta (con una nueva dirección MAC) pero no desea cambiar la configuración relacionada con Linux como por ejemplo las interfaces de red.
El comando, junto con nestat descripto anteriormente, es uno de los comandos más frecuentemente utilizados para administrar Oracle RAC. El desempeño de Oracle RAC depende en gran medida de la interconexión utilizada entre los nodos del cluster. Si la interconexión se satura (es decir, que no puede soportar más tráfico adicional) o falla, usted podrá observar una disminución de desempeño. Lo mejor en este caso es observar el output ifconfig para detectar las fallas. Este es un ejemplo típico:
eth9      Link encap:Ethernet   HWaddr 00:1C:23:CE:6F:82
inet addr:10.14.104.31   Bcast:10.14.104.255   Mask:255.255.255.0
RX bytes:1670104239570 (1.5 TiB)  TX bytes:42726010594 (39.7 GiB)
Observe el texto resaltado en rojo. El conteo arrojado es extremadamente elevado; la cantidad ideal debería ser 0 o cercana a 0. Una cantidad mayor a medio millón implicaría una interconexión defectuosa que rechaza los paquetes, provocando que la interconexión los reenvíe—lo cual sería clave para el diagnóstico de problemas.
El estado input y output a través de una interfaz de red se evalúa por medio del comando netstat. Este comando puede brindar información completa sobre el desempeño de la interfaz de red, incluso por debajo del nivel de socket. Aquí vemos un ejemplo:
tcp        0      0 prolin1:31027 prolin1:5500     TIME_WAIT
tcp        4      0 prolin1l:1521 applin1:40205    ESTABLISHED
tcp        0      0 prolin1l:1522 prolin1:39957    ESTABLISHED
tcp        0      0 prolin1l:3938 prolin1:31017    TIME_WAIT
tcp        0      0 prolin1l:1521 prolin1:21545    ESTABLISHED
El output de arriba muestra todos los sockets abiertos. En términos más simples, un socket es similar a una conexión entre dos procesos. [Por favor tenga en cuanta que, estrictamente hablando, los conceptos “sockets” y “conexiones” son técnicamente diferentes. Un socket podría existir sin una conexión. De todas maneras, el debate entre sockets y conexiones escapa del alcance de este artículo. Por eso simplemente me limité a presentar el concepto de una manera fácil de comprender]. Naturalmente, una conexión debe tener un origen y un destino, denominados dirección local y remota. Los puntos de destino podrían estar en el mismo servidor o en servidores distintos.
En muchos casos, los programas se conectan al mismo servidor. Por ejemplo, si dos procesos se comunican entre ellos, la dirección local y remota será la misma, como puede observar en la primera línea –tanto la dirección local como la remota corresponden al servidor “prolin1”. No obstante, los procesos se comunican a través de un puerto, que es diferente. El puerto se muestra luego del nombre de host, después de los dos puntos “:”. El programa del usuario envía los datos que deben remitirse a través del socket a una cola y el receptor los lee desde la cola de destino remoto. Éstas son las columnas del output:
la columna del extremo izquierdo denominada “ Proto” muestra el tipo de conexión – tcp en este caso.
La columna Recv-Q muestra los bytes de datos en cola a ser enviados al programa del usuario que estableció la conexión. Este valor debería ser un valor cercano a 0, preferentemente. En los servidores ocupados este valor será mayor a 0 pero no debería ser demasiado alto. Una cantidad mayor no podría significar mucho, a menos que observe una cantidad elevada en la columna Send-Q, descripta a continuación.
La columna Send-Q denota los bytes en cola a ser enviados al programa remoto, es decir, el programa remoto aún no ha confirmado su recepción. Esta cantidad debería ser cercana a 0. Una cantidad mayor podría indicar un cuello de botella en la red.
Local Address se refiere al origen de la conexión y el número de puerto del programa.
Foreign Address hace referencia al host de destino y el número de puerto. En la primera línea, tanto el origen como el destino corresponden al mismo host: prolin1. La conexión se encuentra simplemente en espera. La segunda línea muestra una conexión establecida entre el puerto 1521 de proiln1 hasta el puerto 40205 del host applin1. Lo más probable es que una conexión de Oracle venga del applin1 cliente hasta el servidor prolin1. El listener de Oracle en prolin1 se ejecuta en el puerto 1521; de manera que el puerto de origen es 1521. En esta conexión, el servidor envía los datos solicitados al cliente.
La columna State muestra el estado de la conexión. Aquí vemos algunos valores comunes.
ESTABLISHED – implica que la conexión ha sido establecida. No significa que los datos fluyen entre los puntos de destino; simplemente que se ha establecido una comunicación entre ellos.
CLOSED – la conexión se ha cerrado, es decir, no está siendo utilizada.
TIME_WAIT – la conexión se está cerrando pero aún hay paquetes pendientes en la red.
CLOSE_WAIT – el destino remoto ha sido cerrado y se ha solicitado el cierre de conexión.
Pues bien, a partir de las direcciones locales (local) y externas (foreign), y especialmente a partir de los números de puertos, probablemente podamos deducir que las conexiones son conexiones relacionadas a Oracle, pero ¿no sería mejor estar seguros? Por supuesto. La opción -p también muestra la información del proceso:
Proto Recv-Q Send-Q Local Address Foreign Address State     PID/Program name
tcp      0     0   prolin1:1521  prolin1:33303 ESTABLISHED 1327/oraclePROPRD1
tcp      0     0   prolin1:1521  applin1:51324 ESTABLISHED 13827/oraclePROPRD1
tcp      0     0   prolin1:1521  prolin1:33298 ESTABLISHED 32695/tnslsnr
tcp      0     0   prolin1:1521  prolin1:32544 ESTABLISHED 15251/oracle+ASM
tcp      0     0   prolin1:1521  prolin1:33331 ESTABLISHED 32695/tnslsnr
Esto muestra claramente el IP del proceso y el nombre del proceso en la última columna, la cual confirma que corresponden a procesos del servidor de Oracle, al proceso listener, y a los procesos del servidor ASM.
El comando netstat puede presentar varias opciones y parámetros. A continuación se detallan los más importantes:
Para ver las estadísticas de red de las distintas interfaces, utilice la opción -i.
Iface MTU  Met RX-OK   RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0  1500  0  6860659    0     0     0    2055833   0     0      0   BMRU
eth8  1500  0  2345       0     0     0        833   0     0      0   BMRU
lo    6436  0  14449079   0     0     0   14449079   0     0      0   LRU
Esto muestra las distintas interfaces presentes en el servidor (eth0, eth8, etc.) y las métricas relacionadas con la interfaz.
RX-OK muestra la cantidad de paquetes que son exitosamente enviados (para esta interfaz)
RX-ERR muestra la cantidad de errores
RX-DRP muestra los paquetes rechazados que debieron ser reenviados (ya sea con éxito o no)
RX-OVR muestra un exceso de paquetes
El próximo grupo de columnas (TX-OK, TX-ERR, etc.) muestra las stats (estadísticas) correspondientes a los datos enviados.
La columna Flg expresa un valor compuesto de la propiedad de la interfaz. Cada letra indica una propiedad específica presente. A continuación se detalla el significado de las letras.
B – Broadcasting (Difusión)
M –Multicast (Multidifusión)
U – Up (Activado)
O – ARP Off (ARP desactivado)
P – Point to Point Connection (Conexión Punto a Punto)
L – Loopback (Circuito cerrado)
Usted pude utilizar la opción --interface (nota: hay dos guiones, no uno) para desplegar una interfaz específica.
Iface MTU Met  RX-OK   RX-ERR RX-DRP RX-OVR TX-OK  TX-ERR TX-DRP TX-OVR Flg
eth0 1500  0 277903459   0      0      0   170897632  0     0      0  BMsRU
De más está decir que, el output es amplio y un poco difícil de captar de un solo intento. Si usted está realizando una comparación entre interfaces, sería lógico tener un output tabular. Si desea examinar los valores en un formato más legible, utilice la opción -e para producir un output extendido:
¿El output le resulta conocido? Debería ser así ya que es el mismo que el output de ifconfig.
Si prefiere que el output despliegue las direcciones de IP en lugar de los nombres del host, utilice la opción -n.
La opción -s muestra el resumen de estadísticas de cada protocolo, en vez de mostrar los detalles de cada conexión. Esto puede combinarse con el flag específico del protocolo, Por ejemplo, -u muestra las estadísticas relacionadas con el protocolo UDP.
Del mismo modo, para ver las stats de tcp, utilice -t y para raw, -r.
Una de las opciones realmente útiles es desplegar la tabla de ruta, utilizando la opción -r.
Destination   Gateway       Genmask          Flags  MSS Window irtt Iface
10.20.191.0   *             255.255.255.128  U       0   0       0  bond0
172.22.13.0   *             255.255.255.0    U       0   0       0  eth9
169.254.0.0   *             255.255.0.0      U       0   0       0  eth9
default       10.20.191.1   0.0.0.0          UG      0   0       0  bond0
La segunda columna del output netstat – Gateway–muestra el gateway de asignación de ruta. Si no se utiliza ningún gateway, aparece un asterisco. La tercera columna– Genmask–muestra la “generalidad” del enrutamiento, es decir, la máscara de red para esta ruta. Al dar una dirección de IP para encontrar una ruta adecuada, el kernel sigue el proceso de cada una de las entradas de enrutamiento, tomando el nivel de bits AND de la dirección y la máscara de red antes de compararlo con el destino de ruta.
La cuarta columna, denominada Flags, despliega las siguientes etiquetas que describen la ruta:
G significa que la ruta utiliza un gateway.
U implica que la interfaz a ser utilizada se encuentra activa (disponible).
H implica que solo puede alcanzarse un único host a través de la ruta. Por ejemplo, el caso de la entrada de loopback (circuito cerrado) 127.0.0.1.
D significa que esta ruta ha sido dinámicamente creada.
! significa que la ruta ha sido rechazada y se descartarán los datos.
La siguientes tres columnas muestran los valores MSS, Window e irtt que se aplicarán a las conexiones TCP establecidas por medio de esta ruta.
MSS representa la sigla Maximum Segment Size (Tamaño de Segmento Máximo) –es el tamaño del datagrama más amplio para realizar la transmisión a través de esta ruta.
Window se refiere a la cantidad máxima de datos que el sistema aceptará en modo single burst desde un host remoto y para esta ruta.
irtt representa la sigla de Initial Round Trip Time (el Valor Inicial del Temporizador TCP). Es un poco difícil de explicar, pero lo haré por separado.
El protocolo TCP posee un control de fiabilidad incorporado. Si un paquete de datos falla durante la transmisión, éste es retransmitido. El protocolo lleva un registro de cuánto tiempo tardan los datos en llegar a destino y en confirmarse su recepción. Si la confirmación no llega dentro de ese plazo de tiempo, el paquete es retransmitido. La cantidad de tiempo que el protocolo debe esperar antes de retransmitir los datos se establece solo una vez para la interfaz (la cual puede cambiarse) y ese valor es conocido como initial round trip time. Un valor de 0 implica que el valor por defecto es utilizado.
Finalmente, el último campo despliega la interfaz de red que utilizará esta ruta.
Cada host accesible en una red debería tener una dirección de IP que le permita identificarse exclusivamente en la red. En Internet, que es una red extensa, las direcciones de IP permiten que las conexiones lleguen a los servidores que ejecutan sitios Web, por ej., www.oracle.com. Por lo tanto, cuando un host (como un cliente) desea conectarse a otro (como un servidor de base de datos) utilizando su nombre y no su dirección de IP ¿cómo el browser cliente sabe a qué dirección conectarse?
El mecanismo de traspaso del nombre de host a las direcciones de IP es conocido como resolución de nombre. En el nivel más rudimentario, el host tiene un archivo especial denominado hosts, que almacena la Dirección de IP – Hostname. Este es un archivo de muestra:
Esto muestra que el nombre del host prolin1.proligence.com se traduce a 192.168.1.101. La entrada especial con la dirección de IP 127.0.0.1 se denomina entrada loopback, la cual vuelve al servidor mismo por medio de una interfaz de red especial denominada lo (que se menciona anteriormente en los comandos ifconfig y netstat).
Ahora bien, de todas formas, usted posiblemente no puede colocar todas las direcciones de IP del mundo en este archivo. Por lo que debería haber otro mecanismo que establezca la resolución del nombre. Un servidor con un propósito especial denominado nameserver realiza esa función. Es como un directorio que provee su compañía telefónica; no su directorio personal. Pueden existir varios nameservers disponibles dentro y fuera de la red privada. El host contacta a uno de estos nameservers primero, obtiene la dirección de IP del host de destino que desea contactar y luego intenta conectarse a la dirección de IP.
¿Y cómo el host sabe cuáles son estos nameservers? Busca en un archivo especial llamado /etc/resolv.conf para obtener esa información. Aquí vemos un archivo resolv de ejemplo.
¿Pero cómo podemos estar seguros de que la resolución del nombre está funcionando perfectamente para un nombre de host específico? En otras palabras, usted quiere asegurarse de que cuando el sistema de Linux intente contactarse a un host denominado oracle.com, pueda encontrar la dirección de IP en el nameserver. El comando nslookup es útil para eso. Vea a continuación cómo utilizarlo:
** server can't  find  oracle-site.com: NXDOMAIN
Analicemos el output. El output del Server (Servidor) es la dirección del nameserver. El nombre oracle.com establece la dirección de IP 141.146.8.66. El nombre fue definido por el nameserver próximo a la palabra Server en el output.
Si usted escribe esta dirección de IP en un browser–http://141.146.8.66 en lugar de http://oracle.com--el browser se dirigirá al sitio oracle.com.
Si usted cometió un error o buscó un host equivocado:
El mensaje es bastante claro: este host no existe.
El comando nslookup ha caído en desuso. En su lugar debería utilizarse un comando nuevo y más poderoso – dig ( domain information groper). En algunos servidores Linux más nuevos, el comando nslookup podría no estar aún disponible.
Aquí vemos un ejemplo; para verificar la resolución del nombre del host oracle.com, debería utilizar el siguiente comando:
;oracle.com.                    IN      A
oracle.com.             300     IN      A       141.146.8.66
oracle.com.             3230    IN      NS      ns1.oracle.com.
oracle.com.             3230    IN      NS      ns4.oracle.com.
oracle.com.             3230    IN      NS      u-ns1.oracle.com.
oracle.com.             3230    IN      NS      u-ns2.oracle.com.
oracle.com.             3230    IN      NS      u-ns3.oracle.com.
oracle.com.             3230    IN      NS      u-ns4.oracle.com.
oracle.com.             3230    IN      NS      u-ns5.oracle.com.
oracle.com.             3230    IN      NS      u-ns6.oracle.com.
ns1.oracle.com.         124934  IN      A       148.87.1.20
ns4.oracle.com.         124934  IN      A       148.87.112.100
u-ns1.oracle.com.       46043   IN      A       204.74.108.1
u-ns2.oracle.com.       46043   IN      A       204.74.109.1
u-ns3.oracle.com.       46043   IN      A       199.7.68.1
u-ns4.oracle.com.       46043   IN      A       199.7.69.1
u-ns5.oracle.com.       46043   IN      A       204.74.114.1
u-ns6.oracle.com.       46043   IN      A       204.74.115.1
Desde el output mammoth, se destacan varias cosas. Muestra que el comando ha enviado una consulta al nameserver y el host obtuvo una respuesta del nameserver. La resolución del nombre también ha sido efectuada en otros nameservers como ns1.oracle.com. Esto demuestra que la consulta tardó 97 milisegundos en ejecutarse.
Si el tamaño del output no es el adecuado, usted puede utilizar la opción +short para eliminar las palabras redundantes del output:
También puede utilizar la dirección de IP para realizar una búsqueda inversa del nombre de host a partir de la dirección de IP. Para esto se utiliza la opción -x.
El parámetro +domain es útil cuando usted busca un host dentro de un dominio. Por ejemplo, supongamos que usted está buscando el host otn en el dominio oracle.com, usted puede utilizar:
O puede utilizar el parámetro +domain:
Se establece la conectividad entre el servidor de aplicaciones y el servidor de base de datos. El archivo TNSNAMES.ORA, utilizado por SQL*Net puede parecerse a este:
El nombre de host prolin3 debería ser determinado por el servidor de aplicaciones. En cualquiera de los casos, éste debería figurar en el archivo /etc/hosts; o el host prolin3 debería definirse en el DNS. Para asegurarse de que la resolución del nombre funciona, y que funciona de manera correcta para dirigirse al host adecuado, usted puede utilizar el comando dig.
Con estos dos comandos usted puede manejar la mayoría de las tareas de red en un entorno Linux. En la que queda de esta presentación, usted aprenderá a administrar un entorno Linux de manera efectiva.
Usted ha ingresado al servidor y ha observado que algunas cosas que deberían estar funcionando, en verdad no lo están. Tal vez algunos procesos fueron cancelados o quizás todos los procesos han sido finalizados debido a un cierre del sistema. En lugar de hacer suposiciones, descubra si el servidor ha sido realmente reiniciado utilizando el comando uptime. El comando muestra el plazo de tiempo durante el cual el servidor ha estado funcionando desde su último reinicio.
El output muestra mucha información de utilidad. La primera columna muestra el momento real en que el comando fue ejecutado. La segunda parte – activo 672 días, 17:46 – muestra el tiempo en que el servidor ha estado activo. Las cifras 17:46 representan las horas y minutos. Por lo tanto, este servidor ha estado funcionando por 672 días, 17 horas y 46 minutos hasta el momento.
El siguiente elemento – 45 usuarios – muestra la cantidad de usuarios que han iniciado sesión en el servidor justo en ese momento.
Los últimos bits del output muestran el promedio de carga del servidor en el último minuto, y en los último 5 y 15 minutos respectivamente. El término “carga promedio” es una cifra compuesta que representa la carga del sistema sobre la base de las métricas de I/O y CPU. Cuanto mayor es el promedio de carga, mayor la carga en el sistema. No se basa en una escala; a diferencia de los porcentajes, no finaliza con una cantidad determinada, como 100. Además, la carga promedio de dos sistemas no puede compararse entre sí. Dicha cifra se utiliza para cuantificar la carga en un sistema y solo es relevante para ese único sistema. Este output muestra que la carga promedio fue de 4,45 en el último minuto, 5,18 en los últimos 5 minutos y así sucesivamente.
El comando no tiene ninguna opción ni acepta ningún parámetro que no sea -V, el cual muestra la versión del comando.
No existe un uso específico de Oracle en torno a este comando, salvo que usted puede conocer la carga del sistema para explicar algunos problemas de desempeño. Si observa algunos problemas de desempeño en la base de datos, y éstos surgen debido a la elevada carga de I/O o CPU, usted inmediatamente debería controlar las cargas promedio utilizando el comando uptime. Si observa un promedio de carga elevado, su próximo paso será realizar un examen detallado para detectar la causa del problema. Para realizar este análisis, usted cuenta con una gran cantidad de herramientas como mpstat, iostat y sar (descriptas en esta presentación de la serie).
Preste atención al output que se muestra a continuación:
Es interesante ver cómo el promedio de carga era bastante elevado (12,90) en el último minuto y luego ha disminuido bastante, incluso hasta niveles irrelevantes, llegando a 1,03 y 1,00 en los últimos 5 y 15 minutos respectivamente. ¿Qué significa esto? Esto demuestra que en menos de 5 minutos, se inició algún proceso que provocó que el promedio de carga subiera repentinamente en el último minuto. Este proceso no estaba presente anteriormente ya que el promedio de carga era bastante bajo. Este análisis nos lleva a concentrarnos en los procesos iniciados en los últimos minutos – acelerando así el proceso de resolución.
Lógicamente, como esto demuestra la cantidad de tiempo en que el servidor ha estado funcionando, también explica por qué la instancia ha estado activa desde aquel momento.
¿Quién ha ingresado en el sistema en este momento? Esa es una simple pregunta que usted podría hacerse especialmente si desea rastrear a algún usuario errante que está ejecutando algunos comandos que consumen recursos.
El comando who responde esa pregunta. Observe aquí el uso más simple de este comando, sin argumentos ni parámetros.
El comando puede presentar varias opciones. La opción -s es la opción por defecto; que produce el mismo output que arriba.
Observando el output, usted quizás esté haciendo memoria para recordar lo que significan las columnas. Bueno, relájese. Puede utilizar la opción -H para desplegar el encabezado:
root     pts/1        Dec 26  13:42 (:0.0)
root     :0           Oct 23  15:32
Ahora el significado de las columnas es claro. La columna NAME muestra el nombre de usuario registrado. LINE muestra el nombre de terminal. En Linux cada conexión se denomina como una terminal con el convenio de denominación pts/<n> en donde <n> es un número que comienza con 1. La terminal :0 es una denominación para la terminal X. TIME muestra la primera vez en que se registraron. Y COMMENTS muestra la dirección de IP desde donde se registraron.
¿Pero qué sucede si usted solo quiere obtener un listado con los nombres de usuarios en lugar de ver todos esos detalles superfluos? La opción -q logra eso. Despliega los nombres de usuarios en una sola línea, ordenados alfabéticamente. También despliega la cantidad total de usuarios al final (45, en este caso):
Algunos usuarios podrían haber iniciado sesión pero no estar realizando ninguna actividad en realidad. Usted puede controlar por cuánto tiempo han estado inactivos utilizando la opción -u, lo cual es realmente útil, especialmente si usted es el jefe.
oracle   pts/2        Jan  8 15:57   .          18127 (10.14.105.139)
oracle   pts/3        Jan  8 15:57  00:26       18127 (10.14.105.139)
La nueva columna IDLE muestra el tiempo de inactividad con el formato hh:mm. ¿Observa el valor “old” en esa columna? Implica que el usuario ha estado inactivo durante más de 1 día. La columna PID muestra el ID del proceso de su conexión shell.
Otra opción útil es -b que muestra cuando el sistema ha sido reiniciado.
Muestra que el sistema ha sido reiniciado el 15 de febrero a la 1:31 p.m. ¿Recuerda el comando uptime? También muestra la cantidad de tiempo durante el cual el sistema ha estado activo. Usted puede restar los días que se observan en uptime para saber la fecha de reinicio. El comando -b facilita esto ya que directamente muestra la fecha de reinicio.
Advertencia Importante: El comando who -b muestra el mes y la fecha únicamente, no el año. De modo que si el sistema ha estado activo por más de un año, el output no reflejará el valor correcto. Por consiguiente el comando uptime siempre es el enfoque preferido, incluso si usted tiene que hacer algunos cálculos. Aquí vemos un ejemplo:
21:37:49 up 675 days, 22:40,   1 user,  load average: 3.35,  3.08, 2.86
Observe que la fecha de reinicio es el 7 de marzo. Eso fue en 2007 ¡no en 2008! El uptime muestra la fecha correcta – ha estado activo durante 675 días. Si las restas no son su fuerte, puede utilizar un simple SQL para obtener esa fecha, 675 días atrás:
La opción -l muestra los inicios de sesión al sistema:
Para descubrir las terminales del usuario que ya no están en uso, utilice la opción -d:
NAME     LINE         TIME     IDLE          PID COMMENT  EXIT
Feb 15  13:31          489 id=si    term=0 exit=0
Feb 15  13:32         2870 id=l5    term=0 exit=0
pts/1        Oct 10  14:53        31869 id=ts/1  term=0 exit=0
pts/4        Jan 11  00:20        22155 id=ts/4  term=0 exit=0
pts/3        Jun 29  16:01            0 id=/3    term=0 exit=0
pts/2         Oct 4  22:35         8371 id=/2    term=0 exit=0
pts/5        Dec 30  03:15         5026 id=ts/5  term=0 exit=0
pts/4        Dec 30  22:35            0 id=/4    term=0 exit=0
Algunas veces el proceso init (el proceso que primero se ejecuta cuando se reinicia el sistema) inicia otros procesos. La opción -p muestra todos esos inicios de sesión que están activos.
Más adelante en este documento, usted conocerá un comando – write – que permite enviar y recibir mensajes en tiempo real. También aprenderá a desactivar la capacidad de otros para escribir en su terminal (el comando mesg). Si desea saber qué usuarios permiten y no permiten a los demás escribir en sus terminales, utilice la opción -T:
El signo + sign antes del nombre de la terminal implica que la terminal acepta los comandos de escritura de otros; el signo “-” significa que la terminal no lo permite. El signo “?” en este campo significa que la terminal no soporta escrituras, por ejemplo, una sesión X-window.
El nivel actual de ejecución del sistema puede obtenerse a través de la opción -r:
Con la opción -a (all) puede obtenerse un listado más descriptivo. Esta opción combina las opciones -b -d -l -p -r -t -T -u. De modo que estos dos comandos producen el mismo resultado:
Aquí vemos un output de muestra (con el encabezado, para que usted puede comprender mejor las columnas):
NAME      LINE          TIME         IDLE          PID COMMENT  EXIT
Feb 15 13:31               489 id=si    term=0 exit=0
run-level 5  Feb 15 13:31                   last=S
Feb 15 13:32              2870 id=l5    term=0 exit=0
LOGIN     tty1         Feb 15 13:32              4081 id=1
Feb 15 13:32              4083 id=2
Feb 15 13:32              4090 id=3
Feb 15 13:32              4166 id=4
Feb 15 13:32              4174 id=5
LOGIN     tty6         Feb 15 13:32              4254 id=6
Feb 15 13:32              4255 id=x
Oct  4 23:14             13754 id=h1
pts/1       Oct 10 14:53             31869 id=ts/1  term=0 exit=0
oracle   + pts/2       Jan  8 15:57   .         18127 (10.14.105.139)
oracle   + pts/3       Jan  8 15:57  00:18      18127 (10.14.105.139)
pts/4       Dec 30 03:15              5026 id=ts/4  term=0 exit=0
pts/3       Jun 29 16:01                 0 id=/3    term=0 exit=0
root     + pts/1       Dec 26 13:42  old         6451 (:0.0)
pts/2       Oct  4 22:35              8371 id=/2    term=0 exit=0
root     ? :0          Oct 23 15:32   ?         24215
pts/5       Dec 30 03:15              5026 id=ts/5  term=0 exit=0
pts/4       Dec 30 22:35                 0 id=/4    term=0 exit=0
Para ver su propio inicio de sesión, utilice la opción -m:
¿Observa el valor pts/2? Es el número de terminal. Usted puede encontrar su propia terminal a través del comando tty:
En Linux existe una estructura de comando especial para mostrar su propio registro de inicio de sesión –who am i. Produce el mismo output como en la opción -m.
Los únicos argumentos permitidos son “am i" y “mom likes” (¡si, aunque no lo crea!). Ambos producen el mismo output,
Original Instant Messenger System
Con la llegada de la mensajería instantánea o los programas de chat quedó comprobado que hemos conquistado el desafío global de mantener un intercambio de información en tiempo real, sin olvidarnos de las comunicaciones de voz. ¿Pero estos programas solo se encuentran en el ámbito de los llamados programas atractivos?
El concepto de chat o mensajería instantánea ha estado disponible durante bastante tiempo en *nix. De hecho, usted tiene un sistema IM seguro y completo incorporado en Linux. Éste le permite conversar de manera segura con cualquier persona conectada al sistema; sin requerir conexión de internet. El chat es activado a través de los comandos – write, mesg, wall y talk. Examinemos cada uno de ellos.
El comando write permite escribir en la terminal de un usuario. Si el usuario ha iniciado sesión en más de una terminal, usted puede dirigirse a una dirección específica. Aquí se muestra cómo escribir el mensaje “Cuidado con el virus” para el usuario “oracle” que inició sesión en la terminal “pts/3”:
La combinación de teclas Control-D finaliza el mensaje, devuelve el shell prompt (#) al usuario final y lo envía a la terminal del usuario. Cuando éste se envía, el usuario “oracle” verá en la terminal pts/3 los mensajes:
Cada línea aparecerá a medida que el remitente presione ENTER después de las líneas. Cuando el remitente presiona Control-D, finalizando la transmisión, el receptor verá EOF en la pantalla. El mensaje se desplegará independientemente de la actual acción del usuario. Si el usuario está editando un archivo en vi, el mensaje aparece y el usuario puede eliminarlo al presionar Control-L. Si el usuario se encuentra en SQL*Plus prompt, el mensaje aún aparece pero no afecta los registros del teclado del usuario.
¿Pero qué sucede si usted no quiere sufrir estas pequeñas molestias? Usted no quiere que nadie le envíe mensajes del tipo –“descuelga el teléfono”. Usted puede hacerlo a través del comando mesg. Este comando desactiva la capacidad de los demás para enviarle mensajes. El comando sin ningún argumento muestra la siguiente capacidad:
Muestra que otros pueden escribirle. Para desactivarlo:
Ahora para confirmar:
Cuando usted intenta escribir en las terminales de los usuarios, quizás desee saber qué terminales han sido desactivadas para que otros no puedan escribir en ellas. El comando -T (descripto anteriormente en este documento) muestra que:
El signo + antes del nombre de terminal indica que ésta acepta escribir comandos de otros; el signo “-“ indica que esto no está permitido. El signo “?” indica que la terminal no soporta escrituras en ella, por ej., una sesión X-window.
¿Y qué ocurre cuando usted desea escribir a todos los usuarios que han iniciado sesión? En lugar de tipear cada uno, utilice el comando wall:
Una vez que se envía, aparece el siguiente texto en las terminales de todos los usuarios que han iniciado sesión:
Esto es muy útil para los usuarios root. Cuando usted quiere cerrar el sistema, desmontar un sistema de archivos, o realizar funciones administrativas similares, quizás desee que todos los usuarios cierren su sesión. Utilice el comando para enviar un mensaje a todos.
Finalmente, el programa talk le permite conversar en tiempo real. Simplemente tipee lo siguiente
Si desea conversar con algún usuario en un servidor diferente – prolin2 –puede utilizar
Esto abre una ventana de conversación en la otra terminal y ahora usted puede conversar con esa persona en tiempo real. ¿Es esto distinto a cualquier otro programa de conversación “profesional” que actualmente utiliza? Probablemente no. A propósito, para que la conversación funcione correctamente, asegúrese de que el talkd daemon esté ejecutándose, ya que éste podría estar desinstalado.
Si, es un comando ¡a pesar de que tenga solo una letra! El comando w es una combinación de los comandos uptime y who ejecutados uno inmediatamente luego del otro, en ese orden. Veamos un output muy común sin argumentos ni opciones.
17:29:22 up 672 days, 18:31,   2 users,
load average: 4.52,  4.54, 4.59
USER   TTY    FROM           LOGIN@ IDLE   JCPU  PCPU WHAT
oracle pts/1  10.14.105.139  16:43  0.00s  0.06s 0.01s w
oracle pts/2  10.14.105.139  17:26  57.00s 3.17s 3.17s sqlplus
El output tiene dos partes distintas. La primera parte muestra el output del comando uptime (descripto arriba en este documento) el cual muestra el tiempo en que el servidor ha esta activo, cuantos usuarios han iniciado sesión y el promedio de carga en el último minuto y en los últimos 5 y 15 minutos. Las partes del output han sido explicadas en el comando uptime. La segunda parte del output muestra el output del comando who con la opción -H (también explicado en este documento). Nuevamente, las numerosas columnas también han sido explicadas en el comando who.
Si usted prefiere no desplegar el encabezado, utilice la opción -h.
Esto elimina el encabezado del output. Es útil en los shell scripts en donde quiere leer y actuar en base al output sin la carga adicional de saltear el encabezado.
La opción -s produce una versión compacta (corta) del output, eliminando el tiempo de inicio de sesión, y los tiempos de JPCU y PCPU.
Usted podría encontrar que el campo “FROM” realmente no es muy útil. Muestra la dirección de IP del mismo servidor, ya que los registros de inicio de sesión son todos locales. Para ahorrar espacio en el output, usted podría suprimir este campo. La opción -f desactiva la impresión del campo FROM:
El comando acepta solo un parámetro: el nombre de un usuario. Por defecto muestra el proceso e inicio de sesión de todos los usuarios. Si usted coloca el nombre de usuario, se muestra el registro de inicio de sesión de ese usuario solamente. Por ejemplo, para mostrar solo el inicio de sesión de los usuarios root, debe emitir:
root  pts/1  :0.0  26Dec08 13days 0.01s   0.01s bash
root  :0      -    23Oct08 ?xdm?  21:13m  1.81s  /usr/bin/gnome-session
La opción -h fue utilizada para ocultar el encabezado.
Un proceso se está ejecutando y usted desea que el proceso finalice. ¿Qué debería hacer? El proceso se ejecuta en un segundo plano, de modo que no necesita ir a la terminal y presionar Control-C; o, tal vez el proceso pertenece a otro usuario (utilizando el mismo userid, como “oracle”) y usted desea que termine. El comando kill justamente va al rescate; hace lo que su nombre sugiere – finaliza el proceso. Su uso más común es:
Supongamos que usted quiere finalizar un proceso denominado sqlplus emitido por el usuario oracle, usted debe conocer su processid, o PID:
oracle    8728 23916  0 10:36 pts/3    00:00:00 sqlplus
oracle    8768 23896  0 10:36 pts/2    00:00:00  grep sqlplus
Ahora para finalizar el PID 8728:
Y así se finaliza el proceso. Por supuesto usted debe ser el mismo usuario (oracle) para finalizar un proceso iniciado por oracle. Para finalizar procesos iniciados por otros usuarios usted debe ser un super usuario – root.
Algunas veces usted puede querer simplemente detener el proceso en vez de finalizarlo. Puedo utilizar la opción -SIGSTOP con el comando kill.
oracle    9790 23916   0 10:41 pts/3    00:00:00 sqlplus   as sysdba
oracle    9885 23896  0 10:41 pts/2    00:00:00  grep sqlplus
Esto es útil para los trabajos que se realizan en segundo plano pero con procesos de primer plano. Simplemente detiene el proceso y le quita el control al usuario. De modo que, si usted verifica el proceso nuevamente luego de emitir el comando:
oracle    9790 23916  0 10:41 pts/3    00:00:00 sqlplus   as sysdba
oracle   10144 23896  0 10:42 pts/2    00:00:00  grep sqlplus
Usted observa que el proceso aún se está ejecutando. No ha finalizado. Para finalizar este proceso, y cualquier proceso que se resista a ser finalizado, debe enviar una nueva señal denominada SIGKILL. La señal por defecto es SIGTERM.
Tenga en cuenta las opciones -SIGSTOP y -SIGKILL, que envían una señal específica (detener y finalizar, respectivamente) al proceso. Del mismo modo hay otras señales que puede utilizar. Para obtener un listado de todas las señales disponibles, utilice la opción -l (la letra “L”, no el número “1”):
También puede utilizar el numeral equivalente de la señal en lugar del verdadero nombre de la señal. Por ejemplo, en lugar de kill -SIGKILL 9790, usted puede utilizar kill -9 9790.
A propósito, este es un comando interesante. Recuerde que casi todos los comandos Linux generalmente son archivos ejecutables localizados en /bin, /sbin/, /user/bin y directorios similares. El PATH ejecutable determina en dónde pueden encontrarse estos archivos de comando. Algunos otros comandos son en realidad comandos “incorporados”, es decir, son parte del shell mismo. Un ejemplo de esto es el comando kill. Para demostrarlo, observe lo siguiente:
Observe el output que arroja el bash shell. El uso es incorrecto ya que el argumento -h no era el adecuado. Ahora utilice el siguiente:
Esta versión del comando kill como ejecutable en el directorio /bin aceptó la opción -h adecuadamente. Ahora usted ya conoce esta sutil diferencia entre los comandos shell incorporados y sus utilidades homónimas (namesake) en la forma de archivos ejecutables.
¿Por qué es importante conocer la diferencia? Es importante porque la funcionalidad varía de manera significativa entre estas dos formas. El comando kill incorporado tiene menos funcionalidad que su utilidad equivalente. Cuando usted emite el comando kill, en verdad está invocando el comando incorporado, no la utilidad. Para incorporar la otra funcionalidad, usted tiene que utilizar la utilidad /bin/kill.
La utilidad kill tiene muchas opciones y argumentos. El más conocido es el comando kill utilizado para finalizar los proceso con los nombres del proceso, en lugar de PIDs. Aquí vemos un ejemplo en el que usted puede finalizar todos los procesos con el nombre sqlplus:
Algunas veces usted quiere ver todos los IDs de los procesos que serán finalizados. La opción -p logra esto. Imprime los PIDs que deberían finalizarse, sin realmente finalizarlos. Sirve como confirmación previa a la acción:
. [builtins]         (1)   - bash built-in commands, see bash(1)
: [builtins]         (1)   - bash built-in commands, see bash(1)
[ [builtins]         (1)   - bash built-in commands, see bash(1)
alias [builtins]     (1)   - bash built-in commands, see bash(1)
bash [builtins]      (1)   - bash built-in commands, see bash(1)
bg [builtins]        (1)   - bash built-in commands, see bash(1)
El output muestra los PIDs de los procesos que serían finalizados. Si usted reemite el comando sin la opción -p, se finalizarán todos esos procesos.
A esta altura usted quizás desee saber cuáles son los otros comandos “incorporados” en el shell, en lugar de las utilidades.
Algunas entradas parecen conocidas – alias, bg, entre otras. Algunas se encuentran meramente incorporadas, por ej., alias. No existe ningún archivo ejecutable llamado alias.
Finalizar un proceso ofrece muchos usos – mayormente se utiliza para finalizar procesos fantasmas, procesos que se encuentran en segundo plano y otros que han sido detenidos en respuesta a un cierre normal de los comandos. Por ejemplo, cuando la instancia de base de datos de Oracle no se está cerrado debido a un problema de memoria. Usted debe cerrarla finalizando uno de los procesos clave como pmon o smon. Esto no debería realizarse todo el tiempo, solo cuando no haya opción.
Si quizás desee finalizar todas las sesiones sqlplus o todos los trabajos rman utilizando el comando de utilidad kill. Los procesos Oracle Enterprise Manager se ejecutan como procesos perl; o procesos DBCA o DBUA, los cuales quizás quiera finalizar rápidamente:
Existe también un uso más común de este comando. Cuando usted quiere finalizar una sesión de usuario en la Base de Datos de Oracle, generalmente realiza alguna de las siguientes acciones:
Busca el SID y Serial# de la sesión
Finaliza la sesión utilizando el comando ALTER SYSTEM
Veamos qué sucede cuando desea finalizar la sesión del usuario SH.
SQL> alter system kill  session '116,5784'
La sesión ha  finalizado; no obstante cuando usted controla en estado de la sesión:
Se muestra como KILLED (finalizada), pero no se ha eliminado por completo. Eso sucede porque Oracle espera hasta que el usuario SH inicie su sesión e intente hacer algo, en ese momento recibe el mensaje “ORA-00028: su sesión ha sido finalizada”. Luego de ese momento la sesión desaparece de V$SESSION.
Una manera más rápida de finalizar una sesión es eliminar el correspondiente proceso del servidor en el nivel de Linux. Para hacerlo, primero busque el PID del proceso del servidor:
El SPID es el ID de Proceso del proceso del servidor. Ahora puede finalizar este proceso:
Ahora si verifica la visión V$SESSION, ésta desaparecerá inmediatamente. El usuario no recibirá el mensaje instantáneamente; pero si intenta realizar una consulta a la base de datos, el obtendrá el siguiente mensaje:
Este en método rápido para finalizar una sesión, no obstante hay ciertos inconvenientes. La base de datos de Oracle debe realizar una limpieza de sesión –deshacer cambios (rollback), etc. Y esto debería realizarse solo cuando las sesiones se encuentran inactivas. Caso contrario, usted puede utilizar una de las dos otras maneras de finalizar una sesión inmediatamente:
A diferencia de la naturaleza dual del comando kill, killall es meramente una utilidad, es decir, es un programa ejecutable en el directorio /usr/bin. El comando es similar a kill en funcionalidad pero en vez de finalizar un proceso sobre la base de su PID, éste acepta el nombre del proceso como argumento. Por ejemplo, para finalizar todos los procesos sqlplus, emita:
Esto finaliza todos los procesos denominados sqlplus (los cuales usted tiene permiso de finalizar, por supuesto). A diferencia del comando kill incorporado, usted no necesita conocer el ID de Proceso de los procesos a finalizar.
Si el comando no finaliza el proceso o el proceso no responde a una señal TERM, usted puede enviar una señal SIGKILL explícita como pudo ver en el comando kill utilizando la opción -s.
Como en el comando kill, usted puede utilizar la opción -9 en lugar de -s SIGKILL. Para obtener un listado de todas las señales disponibles, usted puede utilizar la opción -l.
STKFLT CHLD CONT STOP TSTP TTIN  TTOU URG XCPU XFSZ VTALRM PROF
WINCH IO PWR SYS
Para obtener el output completo del comando killall, utilice la opción -v:
Algunas veces usted quizás quiera examinar el proceso antes de finalizarlo. La opción -i le permite ejecutarlo interactivamente. Esta opción solicita su input antes de finalizarlo:
¿Qué sucede cuando usted aprueba un nombre de proceso equivocado?
No existe ningún proceso de ejecución denominado wrong_process entonces no se ha finalizado nada y el output lo ha mostrado claramente. Para eliminar este reclamo “no process killed”, utilice la opción -q. Esa opción es muy útil en shell scripts en donde usted no puede analizar el output. En cambio, si usted desea capturar el código de retorno del comando:
El código de retorno (que se muestra en la variable shell $?) es “1”, en vez de “0”, lo cual indica una falla. Usted puede controlar el código de retorno para examinar si el proceso killall resultó exitoso, es decir, si el código de retorno es “0”.
Algo interesante en torno a este comando es que no se finaliza por si mismo. Por supuesto hace finalizar otros comandos killall en otro sitio pero no en si mismo.
Al igual que el comando kill, el comando killall también es utilizado para finalizar procesos. La mayor ventaja de killall es la capacidad de desplegar el processid y la naturaleza interactiva que posee. Supongamos que usted desea finalizar todos los procesos perl, java, sqlplus, rman y dbca pero no de manera interactiva; usted puede emitir:
Esto le permite ver el PID antes de finalizarlos, lo cual puede ser muy útil.
En este documento usted conoció los siguientes comandos (mostrados alfabéticamente)
Una nueva versión de nslookup
Para desplegar información en las interfaces de red
Para finalizar un proceso específico
Para finalizar un proceso específico, un grupo de procesos y los nombres que coinciden con un patrón
Para activar o desactivar la capacidad de los demás para desplegar algo en la terminal de uno.
Para desplegar estadísticas y otras métricas sobre el uso de la interfaz de red
Para buscar el nombre de host de su dirección de IP o buscar la dirección de IP para su nombre de host en DNS
Para establecer un sistema de Mensajería Instantánea entre dos usuarios para lograr una conversación en tiempo real
Para saber por cuánto tiempo ha estado funcionando el sistema y conocer su carga promedio en 1, 5 y 15 minutos
Es una combinación de uptime y who
Para desplegar texto en las terminales de todos los usuarios que han iniciado sesión
Para desplegar a todos los usuarios que han iniciado sesión en el sistema y para saber lo que están haciendo
Para desplegar instantáneamente algo en la sesión de la terminal de un usuario específico
Como he mencionado anteriormente, no es mi intención presentarles cada comando disponible en los sistemas Linux. Usted debe conocer solo algunos de ellos para administrar un sistema de manera efectiva y esta serie le muestra los más importantes. Practíquelos en su entorno para comprenderlos mejor – con sus parámetros y opciones. En el próximo documento, el último de ellos, usted aprenderá a administrar un entorno Linux – en una máquina común, en una máquina virtual, y en la nube.
Arup Nanda ( arup@proligence.com) ha sido DBA exclusivo de Oracle durante más de 12 años, con experiencia en todas las áreas de tecnología de Base de Datos de Oracle, y fue nombrado "DBA del Año" por Oracle Magazine en 2003. Arup es disertante en eventos relacionados con Oracle, escritor frecuente en publicaciones de Oracle, además de desempeñarse como Director de Oracle ACE. Asimismo ha sido coautor de cuatro libros, con inclusión de RMAN Recipes for Oracle Database 11g: A Problem Solution Approach .

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución