我执行这个
time sudo nice -n -20 bash myscript.sh
然后 myscript.sh 处理一些文件并使用结果创建文件。
这样做有两个问题:
- 该脚本以 root 身份运行
- 生成的文件归 root 所有
我不希望脚本以 root 权限运行(以防我在其中犯了一个错误,它开始删除重要的内容等),并且输出应该归我所有。
我需要 sudo 来更改脚本的优先级,但如何以普通用户身份运行脚本?
答案1
您必须将 uids 和 gids 切换回来。您可以使用zsh
分配来将$USERNAME
所有 uid、euid、gids 等更改为相应用户的用户,就好像该用户刚刚登录而没有进行任何其他更改一样。
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
,$EGID
变量,除了 gid 还具有有关补充 gids 的信息(并且还可以执行通过它自己):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
相反的方法,尽管要注意其参数的处理非常不可移植(并且通常无法按照我的经验记录),有些人将数字视为增量,一些作为新值:
sh -c 'sudo renice -n -20 -p "$$" && exec bash ./myscript.sh'
将更改进程运行的良好性sh
,然后在同一进程中继续运行bash
,而无需更改 uids/gids 或进程sh
。这里从renice
util-linux 2.38.1 开始,套最好不要-20
将其减少 20喜欢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 ~ $