Dlaczego nie mogę użyć renice, aby zwiększyć wartość procesu?

25

Od man renice:

Użytkownicy inni niż superużytkownicy mogą jedynie zmieniać priorytet własnych procesów i mogą jedynie monotonicznie zwiększać swoją `` niezłą wartość '' (ze względów bezpieczeństwa) w zakresie od 0 do PRIO_MAX (20) [...]

Mogę więc realizować renicewłasne procesy w górę (nadać im niższy priorytet), ale nigdy w dół:

$ renice 10 22316
22316 (process ID) old priority 0, new priority 10
$ renice 9 22316
renice: failed to set priority for 22316 (process ID): Permission denied

Dlaczego to? Rozumiem, dlaczego normalni użytkownicy nie mogą ustawić ładnych wartości poniżej 0, ale dlaczego, skoro mogę zmniejszyć priorytet do 10, nie mogę go ponownie zwiększyć do 9? Jaki jest „powód bezpieczeństwa”? Mam prawo uruchomić proces o wartości 9, więc dlaczego nie mogę go zmienić na 9?


EDYCJA: Powinienem nauczyć się przewijać w dół. Okazuje się, że jest to wymienione jako błąd w man renice:

BUGS
     Non super-users can not increase scheduling priorities of their own
     processes, even if they were the ones that decreased the priorities 
     in the first place.

To jeszcze bardziej mylące. Jeśli uważają to zachowanie za błąd, to dlaczego nie zmienić? reniceKomenda pojawiła się w 4.0BSD co moim zdaniem jest od roku 1980. To powinno być bardzo łatwe do naprawienia, więc z jednej strony wydaje się, że wybrano go opuścić, az drugiej, że listy to jako błąd.

terdon
źródło
Ponieważ niektóre priorytety wyższe niż 0 mogą być egzekwowane przez proces systemowy lub moduł bezpieczeństwa i nigdy nie powinny być zmniejszane przez użytkownika (i nie ma wystarczającej kontroli wystarczającej do zdefiniowania minimalnej pewności danego procesu użytkownika innej niż stała wartość 0) ? Nie odpowiedź, bo nie jestem pewien, ale zgaduję.
lgeorget

Odpowiedzi:

19

Od Linuksa 2.6.12 zależy to od wartości limitu RLIMIT_NICE ( ulimit -e). Który może przyjmować wartości od 0 do 40. Limit ten jest bardziej limitem priorytetu procesu (im większa liczba, tym wyższy priorytet może zostać ustawiony przez użytkownika dla procesu).

Zauważysz, że domyślna wartość to 20 na Ubuntu 10.04 i 0 na przykład w Debianie jessie.

Wartość ntego limitu oznacza, że ​​proces bez możliwości CAP_NICE może jedynie zwiększyć priorytet procesu do maksymalnie n, co oznacza zmniejszenie uprzywilejowania do uprzywilejowania 20 - n. Tak więc dla wartości 0 oznacza to, że żaden nieuprzywilejowany użytkownik nie może obniżyć uprzywilejowania poniżej 20, więc żaden nieuprzywilejowany użytkownik nie może obniżyć uprzywilejowania.

Przy wartości 20 użytkownicy nieuprzywilejowani mogą zmniejszyć wartość z powrotem do 0.

Administrator musi zdecydować, czy zezwoli użytkownikom na obniżenie priorytetu procesu i do jakiego poziomu, ustawiając dla niego twardy limit.

Aby dowiedzieć się, dlaczego administrator może nie chcieć, aby użytkownicy obniżali priorytet procesu, zobacz odpowiedź Flup .

Stéphane Chazelas
źródło
1
Ach! To jest konfigurowalny! OK, to ma sens, dzięki.
terdon
„wartości od 0 do 40. [...] Zauważysz, że domyślna wartość to 20 na Ubuntu 10.04 i 0 na przykład w Debianie jessie.” -> Ciekawe, twarde / miękkie ulimity są dla mnie rzeczywiście 0 na debian jessie. Mogę podnieść do 20, ale poza tym dostaję „bash: ulimit: priorytet planowania: nie można modyfikować limitu: nieprawidłowy argument”, wartości ujemne również nie są akceptowane.
thomanski
20

To z tego, co nazwałbym polityką . Chodzi o to, że zwykli użytkownicy nie mogą zastąpić działań użytkowników uprzywilejowanych.

Powiedzmy, że jesteś użytkownikiem na jakimś ogromnym serwerze współdzielonym. Prowadzisz potworne procesy powodujące nadmierne obciążenie procesora ze szkodą dla innych użytkowników. Sysadminrenice niektóre z twoich procesów, ponieważ nie bardzo cię lubi. System operacyjny nie pamięta, kto to zrobił renice, ale wie, że zwykli użytkownicy nie mogą odwrócić działania. W ten sposób sysadmin ma kontrolę nad priorytetami procesów normalnych użytkowników.

Flup
źródło
1
Rozumiem to, ale nadal wydaje się dziwne. Właśnie zdałem sobie sprawę, że jest nawet wymieniony jako błąd w man renice.
terdon
3
Myślę, że sedno błędu polega na tym, że „osoby niebędące superużytkownikami nie mogą zwiększyć priorytetów własnych procesów w zakresie planowania, nawet jeśli to one zmniejszyły priorytety w pierwszej kolejności ”. tzn. jest efektem ubocznym tego egzekwowania, że ​​przypadkowego renicenie można cofnąć inaczej niż przez uprzywilejowanego użytkownika.
Flup
7
Ponieważ system nie pamięta, kto ustawił priorytet. Idealnie byłoby, gdybyś podniósł fajny poziom, a następnie chciał go obniżyć, byłoby to dozwolone ... ale system nakłada ogólny zakaz właśnie dlatego, że nie przechowuje informacji o tym, kto co niszczył, więc nie można cofnąć reniceto rootzrobiło.
Flup
1
@IwillnotexistIdonotexist myśli o systemach z wieloma użytkownikami. Administrator może chcieć podnieść priorytet twoich procesów do 5 i obniżyć moje do 10. To wciąż jest w zasięgu zwykłych użytkowników, ale nie będę w stanie tego zmienić i ukraść czasu procesora, na jaki zasługujesz. Taki jest pomysł, jak wyjaśnił Flup. Jednak, jak wyjaśnił StephaneChazelas , można to skonfigurować, więc administrator systemu może wybrać to, co wolą.
terdon
1
Odpowiedź na „dlaczego?” Po prostu najprawdopodobniej brzmi „ponieważ nikt nie potrzebował go wystarczająco, aby napisać kod, aby go naprawić”. Kiedy pierwotnie napisano Uniksa, śledzenie, kto ustawia priorytet procesu, może być kosztowne pod względem użycie pamięci i praca nad aktualizacją, ale na nowoczesnych komputerach jest to znikome, pozostawiając po prostu brak motywacji do pisania kodu do śledzenia tego w witrynach, które chcą zachować oryginalną politykę „użytkownik nie może zastąpić sysadmin”.
alanc
-1

Dziwne ? działa dla mnie na

Linux clafujiu 2.6.32-57-generic #119-Ubuntu \
 SMP Wed Feb 19 01:04:55 UTC 2014 i686 GNU/Linux

przykład

$ renice 8 --pid 21122
21122: old priority 9, new priority 8
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122   8
21146   0
21155   0
21209   0
christian@clafujiu:~/tmp$ renice 15 --pid 21122
21122: old priority 8, new priority 15
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122  15
21146   0
21155   0
21211   0
christian@clafujiu:~/tmp$ renice 10 --pid 21122
21122: old priority 15, new priority 10
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122  10
21146   0
21155   0
21213   0

2. edycja

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.4 LTS"

Skonfiguruj zmiany

/etc/security/limits.conf

@audio          -       rtprio          100
@audio          -       nice            -10

I jestem członkiem grupy audio, aby zmniejszyć opóźnienie z jack / ardor i bufor xruns podczas nagrywania.

renice

$ renice --version
renice from util-linux-ng 2.17.2
X Tian
źródło
Na jakiej dystrybucji jesteś? nie działa w systemie AIX 6.2
Kiwy
Proszę zamieścić dane wyjściowe cat /etc/lsb*i renice --version.
terdon
renice --version renice from util-linux-ng 2.17.2ale wciąż w systemie AIX nie jest to możliwe
Kiwy