You could simply monitor v$session. One thing I'll often use is a lock to see if the listener is running and also control that only one listener is running, eg
SQL> declare
2 l_listener varchar2(128);
3 l_request int;
4 begin
5 dbms_lock.allocate_unique('MY_LISTENER', l_listener);
6 l_request := dbms_lock.request(l_listener, dbms_lock.x_mode, 0, false);
7 --
8 -- rest of listener stuff
9 --
10 end;
11 /
PL/SQL procedure successfully completed.
SQL> select l.*
2 from sys.dbms_lock_allocated a,
3 v$lock l
4 where a.name = 'MY_LISTENER'
5 and a.lockid = l.id1;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ----------
00007FFC8AA4CD80 00007FFC8AA4CE00 21 UL 1073742527 0 6 0 157
So the presence of the lock means the listener is there in a session, and if I erroneously ran a second copy of the listener, it would not get the lock and hence I could terminate that second execution.
Search this site for dbms_lock.request for plenty of of examples.