Sui sistemi unix il meccanismo di gestione di thread è
sostanzialmente diverso dall'ambiente Microsoft. Senza approfondire
l'argomento diremo semplicemente che il "Task Manager" di Windows
NT / 2000 non ci permette di identificare, e di conseguenza "killare",
un singolo thread.
Fortunatamente nel Resource Kit della Microsoft troviamo un
utility che ci permette di verificare l'attività dei processi
e dei singoli thread ciascuno identificato dal suo bravo "TID"
(Thread ID): "Qslice". Tale utile programma è per fortuna
distribuito dalla Microsoft anche al di fuori del (costoso?) Resource
Kit ed è reperibile sul sito della casa di Redmond.
Qslice, una volta lanciato, si presenta con una finestra in
cui troviamo incolonnati: PID --> ID del processo in esecuzione
Image Name --> Nome del processo % Process CPU usage --> diagramma
a barre della percentuale di occupazione CPU
Nessuna opzione, nessun menù, nessuna frivolezza a meno
dei colori rosso, per identificare "tempo macchina" del kernel,
e blu per mostrare il "tempo macchina" di applicazioni utente.
Cliccando sulla riga del processo incriminato compare una finestra
simile ove compaiono i dettagli sui thread del processo stesso,
tra cui il TID (Thread ID).
La Oracle, dal canto suo, mette a disposizione insieme al suo
Database Server l'utility OraKill che consente, una volta identificato
il thread incriminato, di provvedere alla sua ... "uccisione".
Lanciandola senza parametri da riga di comando otteniamo un
succinto help:
C:\>orakill
Usage: orakill sid thread
where sid = the Oracle instance to target
thread = the thread id of the thread to kill
The thread id should be retrieved from the spid column of a query such as:
select spid, osuser, s.program
from v$process p, v$session s
where p.addr=s.paddr
Quello che segue è uno script un pò più
ricco di dettagli:
set linesize 130
set pagesize 80
col schemaname for a12
col program for a20
col username for a12
col machine for a12
col sid for 99990
col serial# for 99990
col thread# for a6
set wrap on
select p.spid thread#, p.background, s.sid, s.serial#,
s.username,s.osuser,s.schemaname,
s.status,s.machine,s.terminal,s.program
from v$process p, v$session s
where p.addr=s.paddr;
col schemaname clear
col program clear
col username clear
col machine clear
col sid clear
col serial# clear
col thread# clear
Ricordatevi di agire con la massima cautela nella scelta del
thread da eliminare. "Solleticare" in questo modo la macchina
può facilmente significare un blocco della stessa! Occhio
ai sistemi in produzione se non volete ritrovarvi "crocifissi
in sala Server".