sudoを使用していくつかのコマンドラインコマンドを実行する

sudoを使用していくつかのコマンドラインコマンドを実行する

私はこれを実行します

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$EGIDzsh-MEnglishnice

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同じプロセスで実行を続けます。ここbashshreniceutil-linux 2.38.1から、セット-2020に減らさない方がいい好きでも、nice -nでもnice()

答え2

ユーザーモードでスクリプトの親和性変更を使用できますsudo renice。これにより、スクリプトの親和性とその後に生成されるすべてのサブプロセスが変更されます(私の質問を修正してくれた@StéphaneChazelasに感謝します)。

-g(プロセスグループ)オプションを参照してくださいrenice。スクリプトはすでに実行中であるため、起動された可能性があるすべてのC ++サブプロセスにも利点を適用する必要があります。

$ cat nicely
#! /bin/bash

for (( j = 0; j < 10; j++ )); do
    printf 'Pid %d nice %d\n' $$ $( nice )
    sleep 3
done

$ ./nicely & Pid=$!; sudo renice -n -14 -g "${Pid}"; wait
[1] 5665
Pid 5665 nice 0
[sudo] password for paul: Pid 5665 nice 0
Pid 5665 nice 0
*******Pid 5665 nice 0
 
5665 (process ID) old priority 0, new priority -14
Pid 5665 nice -14
...
Pid 5665 nice -14
[1]+  Done                    ./nicely
paul@paul-RV415-RV515 ~ $ 

関連情報