Как правильно отсоединить команду?

У меня есть этот небольшой сценарий, который я использую для запуска корневого окна Nautilus (да, опасный, но иногда необходимый):

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

Это работает, но Системный монитор показывает, что, пока корневой Наутилус не закрывается, у меня нет только корневого экземпляра процесса наутилуса, но также и корневого gksudo, sudo, и xdg-открытых экземпляров.

Я идеально хотел бы иметь просто корневое выполнение экземпляра наутилуса, которое является тем, что я думал, что запаздывающий амперсанд в командной строке, как предполагалось, сделал.

Как я заставляю наутилус отсоединяться правильно? Это может быть сделано вообще?

1
задан 11 September 2014 в 23:14

2 ответа

Это несовершенно, но достаточно близко:

#!/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

Некоторые объяснения:

set -e

Это гарантирует выходы сценария, если пользователь отменяет из подсказки пароля или если что-либо еще перестало работать.

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

Эта строка не возвратится, пока пользователь не ввел пароль или отменил из подсказки. echo команда является inoccuous и просто делает для хорошей обратной связи, когда скрипт запущен из командной строки.

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

gksudo ... & возвраты сразу же (потому что это отсоединяется от процесса сценария), независимо от возможной подсказки пароля. Поэтому мы запросили пароль на предыдущей строке, потому что мы иначе не можем сказать, сколько времени мы должны будем спать позже.

Обратите внимание также что xdg-open / & также отсоединится от gksudo, таким образом, мы заканчиваем с двумя висячими строками: gksudo (бездетный) и xdg-open (родитель желаемого корня nautilus процесс).

PID_GKSUDO=`pgrep -n gksudo`
sleep 10

Здесь мы восстанавливаемся xdg-open идентификатор процесса (сразу доступный) и затем ожидает nautilus-gdu инициализировать и окно для появления. Если бы мы не ожидали, то следующая выбирающая PID команда перестала бы работать, потому что процесс не существовал бы все же (pgrep возвратил бы ошибку 1, и сценарий не продолжится к kill строка).

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

Наконец, мы добираемся xdg-open PID и kill бесполезные процессы прежде, чем выйти из сценария.

0
ответ дан 11 November 2019 в 09:32

Используя disown встроенный удар, я могу добраться xdg-open отсоединяться от gksudo, но ничего не может сделать о nautilus:

Команда:

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

Эффект:

$ 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)

К сожалению, это уезжает gksudo брожение вокруг, выполнение ничего:

$ 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)

Если Вы не будете возражать против взлома, этот сценарий может избавиться от gksudo процесс, принимая Вас может ввести достаточно быстро:

#! /bin/bash

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

Если Вы не можете ввести достаточно быстро, корректироваться sleep продолжительность.

2
ответ дан 7 December 2019 в 14:06

Другие вопросы по тегам:

Похожие вопросы: