You can try to use that NSQL portlet to audit sessions. It will exclude all BG sessions:
SELECT @SELECT:DIM:USER_DEF:IMPLIED:USER_LOGGINS:SQLWRAP.DIM_KEY:DIM_KEY@
,@SELECT:DIM_PROP:USER_DEF:IMPLIED:USER_LOGGINS:SQLWRAP.user_name:user_name@
,@SELECT:DIM_PROP:USER_DEF:IMPLIED:USER_LOGGINS:SQLWRAP.full_name:full_name@
,@SELECT:DIM_PROP:USER_DEF:IMPLIED:USER_LOGGINS:SQLWRAP.date_of_login:date_of_login@
,@SELECT:DIM_PROP:USER_DEF:IMPLIED:USER_LOGGINS:SQLWRAP.times_logged_in:times_logged_in@
FROM
(
select
rownum dim_key,
q.user_name user_name,
q.full_name full_name,
q.date_of_login date_of_login,
q.times_logged_in times_logged_in
from (
select
csu.user_name user_name,
csu.first_name||' '||csu.last_name full_name,
trunc(ls.created_date) date_of_login,
count(*) times_logged_in
from log_sessions ls, cmn_sec_users csu
where csu.id = ls.user_id
and ls.token in (select distinct session_cookie from log_details) ----- to exclude all the bg sessions
group by csu.user_name, csu.first_name||' '||csu.last_name, trunc(ls.created_date)
order by trunc(ls.created_date) desc, count(*) desc
) q
) SQLWRAP
WHERE @FILTER@
When you are 14.2 there are other more accurate ways to find out.
and then just by running job to clean up sessions or restarting services will "kill" session if user is not logged in anymore.