ps -o comm= -p "$(($(ps -o ppid= -p "$(($(ps -o sid= -p "$$")))")))"
Pode lhe dar bons resultados. Ele fornece o nome do processo que é o pai do líder da sessão. Para processos iniciados em um emulador de terminal, geralmente seria o processo que executa o emulador de terminal (a menos que itens como screen
, expect
, tmux
... estejam sendo usados (embora observe que screen
e tmux
são emuladores de terminal) ou novas sessões são iniciadas explicitamente com setsid
, start-stop-daemon
...)
Se você encontrar parênteses aninhados difíceis de ler, poderá escrevê-lo em várias linhas:
ps -o comm= -p "$((
$(
ps -o ppid= -p "$((
$(
ps -o sid= -p "$$"
)
))"
)
))"
Ou use variáveis (que também podem ajudar a tornar o script mais auto-explicativo):
sid=$(ps -o sid= -p "$$")
sid_as_integer=$((sid)) # strips blanks if any
session_leader_parent=$(ps -o ppid= -p "$sid_as_integer")
session_leader_parent_as_integer=$((session_leader_parent))
emulator=$(ps -o comm= -p "$session_leader_parent_as_integer")
Você também pode tentar analisar wtmp
, em que os emuladores de terminal geralmente registram uma entrada com seu pid associado ao dispositivo de pseudo-terminal. Isso funciona para mim em um sistema Debian desde que expect / screen / tmux ... não esteja envolvido:
ps -o comm= -p "$(
dump-utmp -r /var/log/wtmp |
awk -v tty="$(ps -o tty= -p "$$")" -F ' *\| *' '
$2 == tty {print $5;exit}')"
(usando dump-utmp
do GNU acct
).