У меня есть этот небольшой сценарий, который я использую для запуска корневого окна Nautilus (да, опасный, но иногда необходимый):
#!/bin/bash
gksudo --description "Launch a root Nautilus" -- sh -c "xdg-open / &"
Это работает, но Системный монитор показывает, что, пока корневой Наутилус не закрывается, у меня нет только корневого экземпляра процесса наутилуса, но также и корневого gksudo, sudo, и xdg-открытых экземпляров.
Я идеально хотел бы иметь просто корневое выполнение экземпляра наутилуса, которое является тем, что я думал, что запаздывающий амперсанд в командной строке, как предполагалось, сделал.
Как я заставляю наутилус отсоединяться правильно? Это может быть сделано вообще?
Это несовершенно, но достаточно близко:
#!/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
бесполезные процессы прежде, чем выйти из сценария.
Используя 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
продолжительность.