Como desanexar corretamente um comando?

0

Eu tenho este pequeno script que eu uso para iniciar uma janela do Nautilus raiz (sim, perigoso, mas às vezes necessário):

#!/bin/bash
gksudo --description "Launch a root Nautilus" -- sh -c "xdg-open / &"

Isso funciona, mas o Monitor do Sistema mostra que, até que o Nautilus raiz esteja desligado, não tenho apenas uma instância do processo nautilus de propriedade da raiz, mas também instâncias gksudo, sudo e xdg-open de propriedade da raiz.

Idealmente, gostaria de ter apenas a instância do nautilus raiz em execução, que é o que eu achava que o "e" comercial na linha de comando deveria fazer.

Como faço para que o Nautilus seja removido corretamente? Pode ser feito em tudo?

    
por Urhixidur 11.09.2014 / 21:14

2 respostas

1

Usando o disown bash construído, consigo xdg-open para desanexar de gksudo , mas não pode fazer nada sobre nautilus :

O comando:

gksudo --description "Launch a root Nautilus" -- bash -c "xdg-open / & disown"

O efeito:

$ pstree -ps $(pgrep -u root nautilus)
init(1)───lightdm(1095)───lightdm(1537)───init(1545)───xdg-open(29323)───nautilus(29376)─┬─{nautilus}(29378)
                                                                                         ├─{nautilus}(29380)
                                                                                         ├─{nautilus}(29381)
                                                                                         └─{nautilus}(29382)

Infelizmente, isso deixa o gksudo por aí, sem fazer nada:

$ pstree -ps $(pgrep gksudo)
init(1)───lightdm(1095)───lightdm(1537)───init(1545)───test.sh(29601)───gksudo(29604)─┬─{gksudo}(29605)
                                                                                      ├─{gksudo}(29606)
                                                                                      ├─{gksudo}(29608)
                                                                                      └─{gksudo}(29610)

Se você não se importa com um hack, este script pode se livrar do processo gksudo , supondo que você possa digitar rápido o suficiente:

#! /bin/bash

gksudo --description "Launch a root Nautilus" -- bash -c "xdg-open / & disown; exit" &
sleep 10; kill %1

Se você não conseguir digitar rápido o suficiente, ajuste a sleep de duração.

    
por muru 11.09.2014 / 21:27
0

Isso é imperfeito, mas perto o suficiente:

#!/bin/bash
set -e
gksudo --description "Launch a root Nautilus" -- \
   sh -c "echo 'Password accepted'"
gksudo -- sh -c "xdg-open / &" &
PID_GKSUDO='pgrep -n gksudo'
sleep 10
PID_XDGOPEN='pgrep -u root -n xdg-open'
sudo kill $PID_XDGOPEN $PID_GKSUDO
exit 0

Algumas explicações:

set -e

Isso garante que o script seja encerrado se o usuário cancelar o aviso de senha ou se algo falhar.

gksudo --description "Launch a root Nautilus" -- \
   sh -c "echo 'Password accepted'"

Esta linha não retornará até que o usuário insira a senha ou seja cancelada no prompt. O comando echo é inocente e apenas fornece um feedback legal quando o script é executado a partir de uma linha de comando.

gksudo -- sh -c "xdg-open / &" &

O gksudo ... & retorna imediatamente (porque se desconecta do processo de script), independentemente de um prompt de senha eventual. É por isso que solicitamos a senha na linha anterior, porque de outra forma não saberemos quanto tempo precisaremos dormir mais tarde.

Note também que xdg-open / & também se desanexará de gksudo , por isso acabamos com dois órfãos: gksudo (sem filhos) e xdg-open (pai da raiz desejada nautilus process).

PID_GKSUDO='pgrep -n gksudo'
sleep 10

Aqui recuperamos a ID do processo xdg-open (disponível imediatamente) e esperamos que nautilus-gdu inicialize e que a janela apareça. Se não esperássemos, o próximo comando de busca de PID falharia porque o processo ainda não existiria ( pgrep retornaria um erro 1 e o script não prosseguiria para a linha kill ).

PID_XDGOPEN='pgrep -u root -n xdg-open'
sudo kill $PID_XDGOPEN $PID_GKSUDO
exit 0

Por fim, obtemos os xdg-open PID e kill dos processos inúteis antes de sair do script.

    
por Urhixidur 12.09.2014 / 17:50