私はこれを実行します
time sudo nice -n -20 bash myscript.sh
その後、Myscript.shはいくつかのファイルを処理し、その結果を使用してファイルを作成します。
これには2つの問題があります。
- このスクリプトはrootとして実行されます。
- 生成されたファイルはルートが所有します。
私はスクリプトがroot権限で実行されることを望まず(誤って重要な内容を削除し始めた場合など)、出力は私のものでなければなりません。
スクリプトの優先順位を変更するにはsudoが必要ですが、通常のユーザーとしてスクリプトを実行するにはどうすればよいですか?
ベストアンサー1
uidとgidを再度切り替える必要があります。zsh
割り当てを使用すると、$USERNAME
ユーザーが他の変更なしでログインしたばかりのように、すべてのuid、euid、gidなどをそのユーザーのものに変更できます。
sudo nice -n -20 zsh -c 'USERNAME=$SUDO_USER; exec bash ./myscript.sh'
または:
sudo nice -n -20 su "$LOGNAME" -c 'exec bash ./myscript.sh'
または:
sudo nice -n -20 sudo -u "$LOGNAME" bash ./myscript.sh
ただし、これにはPAMスタックを再確認し、状態のリセットを含む環境への追加の変更(必要な場合も必要ない場合もあります)が含まれる場合があります。
それにもかかわらず、以前に持っていたGIDがユーザーデータベースのGIDでない場合は、別のGIDセットで終わることがあります。
リストをそのままリセットするには、別のオプションはの助けを借りてリストを渡すことです。たとえば、perl
(with)と同じ変数があります$UID
。ただし、 gid には追加の gid に関する情報も含まれています。自体):$GID
$EGID
zsh
-MEnglish
nice
run_with_nice() (
exec perl -MEnglish -e '
exec qw(sudo perl -MEnglish -MPOSIX=nice -e), qq(
nice(shift\@ARGV);
\$GID = "$GID"; \$EGID = "$EGID"; \$UID = $UID; \$EUID = $EUID;
exec \@ARGV), "--", @ARGV' -- "$@"
)
次に、次を実行します。
$ run_with_nice -20 ps -o pid,user,group,nice,args
PID USER GROUP NI COMMAND
6955 chazelas chazelas -20 ps -o pid,user,group,nice,args
またはあなたの場合:
run_with_nice -20 bash ./myscript.sh
この場合、好みを変更する別の方法は、renice
反対の方法を使用することです。しかし、パラメータ処理は移植性が非常に低く(私の経験では一般的に文書化されていない)、一部の人々は次のように数字を扱います。 deltas 、一部は新しい値です。
sh -c 'sudo renice -n -20 -p "$$" && exec bash ./myscript.sh'
プロセスがどれだけうまく実行されるかを変更してから、uids / gidsまたはプロセスを変更せずにsh
同じプロセスで実行を続けます。ここbash
sh
renice
util-linux 2.38.1から、セット-20
20に減らさない方がいい好きでも、nice -n
でもnice()
。