web-dev-qa-db-ja.com

コマンドを適切に切り離す方法は?

ルートNautilusウィンドウを起動するために使用する次の小さなスクリプトがあります(そうです、危険ですが、場合によっては必要です)。

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

これは機能しますが、システムモニターは、ルートNautilusがシャットダウンされるまで、ルートが所有するnautilusプロセスインスタンスだけでなく、ルートが所有するgksudo、Sudo、およびxdg-openインスタンスも持っていることを示しています。

理想的には、ルートnautilusインスタンスのみを実行したいと思います。これは、コマンドラインの末尾のアンパサンドが実行すると想定されていたものです。

Nautilusを適切に切り離すにはどうすればよいですか?それはまったくできますか?

1
Urhixidur

disown bashビルトインを使用すると、xdg-opengksudoからデタッチしますが、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
muru

これは不完全ですが十分に近いです:

#!/ bin/bash 
 set -e 
 gksudo --description "Launch a root Nautilus"-\ 
 sh -c "echo 'Password allowed '"
 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 

いくつかの説明:

セット-e

これにより、ユーザーがパスワードプロンプトをキャンセルした場合、または何かが失敗した場合に、スクリプトが終了します。

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

この行は、ユーザーがパスワードを入力するか、プロンプトからキャンセルするまで戻りません。 echoコマンドは無害で、スクリプトがコマンドラインから実行されたときに、Niceフィードバックを提供します。

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

gksudo ... &は、最終的なパスワードプロンプトに関係なく、すぐに戻ります(スクリプトプロセスから切り離されるため)。前の行でパスワードの入力を求めたのはこのためです。それ以外の場合は、後でスリープする必要がある時間を特定できないためです。

また、xdg-open / &gksudoから切り離されるため、gksudo(子なし)とxdg-open(目的のルートnautilusプロセスの親)の2つの孤立が発生します。

PID_GKSUDO = `pgrep -n gksudo` 
 sleep 10

ここでは、xdg-openプロセスID(すぐに利用可能)を回復し、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
Urhixidur