Tại sao tôi không thể sử dụng renice để tăng giá trị tốt đẹp của quy trình?


25

Từ man renice:

Người dùng không phải siêu người dùng chỉ có thể thay đổi mức độ ưu tiên của các quy trình mà họ sở hữu và chỉ có thể tăng đơn điệu `` giá trị đẹp '' (vì lý do bảo mật) trong phạm vi 0 thành PRIO_MAX (20) [...]

Vì vậy, tôi có thể renicetự xử lý các quy trình của mình trở lên (ưu tiên thấp hơn) nhưng không bao giờ đi xuống:

$ 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

Tại sao lại thế này? Tôi có thể hiểu tại sao người dùng bình thường không thể đặt giá trị đẹp thấp hơn 0, nhưng tại sao vì tôi có thể giảm mức ưu tiên xuống 10 nên tôi không thể tăng lại thành 9? "Lý do bảo mật" là gì cho điều này? Tôi có quyền khởi chạy một quy trình có giá trị tốt là 9, vậy tại sao tôi không thể đổi tên thành 9?


EDIT: Tôi nên học cách cuộn xuống. Hóa ra điều này được liệt kê như là một lỗi trong 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.

Điều đó thậm chí còn khó hiểu hơn. Nếu họ coi hành vi này là một lỗi, tại sao không thay đổi nó? Các renicelệnh xuất hiện trong 4.0BSD mà tôi nghĩ là từ năm 1980. Điều này sẽ rất dễ dàng để sửa chữa vv Một mặt họ dường như đã chọn để lại nó và mặt khác họ liệt kê nó như là một lỗi.


Bởi vì một số ưu tiên cao hơn 0 có thể được thực thi bởi quy trình hệ thống hoặc mô-đun bảo mật và người dùng sẽ không bao giờ bị giảm (và không có kiểm soát nào đủ tốt để xác định mức độ tối thiểu của quy trình người dùng nhất định ngoài giá trị cố định 0) ? Không phải là một câu trả lời như tôi không chắc chắn mà là một phỏng đoán.
lgeorget

Câu trả lời:


19

Kể từ linux 2.6.12, điều đó phụ thuộc vào giá trị của giới hạn RLIMIT_NICE ( ulimit -e). Giá trị này có thể lấy các giá trị từ 0 đến 40. Giới hạn đó là giới hạn về mức độ ưu tiên của quá trình (số đó càng lớn, mức độ ưu tiên mà người dùng có thể đặt cho một quy trình càng cao).

Bạn sẽ nhận thấy giá trị mặc định là 20 trên Ubuntu 10.04 và 0 trong jessie Debian chẳng hạn.

Giá trị của ngiới hạn đó có nghĩa là một quy trình không có khả năng CAP_NICE chỉ có thể tăng mức độ ưu tiên của quy trình lên đến mức n, có nghĩa là giảm độ độc đáo xuống mức độ đẹp 20 - n. Vì vậy, với giá trị 0, điều đó có nghĩa là không người dùng không có đặc quyền nào có thể hạ thấp độ đẹp dưới 20, vì vậy không người dùng không có đặc quyền nào có thể hạ thấp độ đẹp.

Với giá trị là 20, người dùng không có đặc quyền có thể giảm độ đẹp trở về 0.

Quản trị viên tùy thuộc vào việc họ có cho phép người dùng hạ mức ưu tiên xử lý của họ hay không và ở mức nào bằng cách đặt giới hạn cứng cho điều đó.

Về lý do tại sao quản trị viên có thể không muốn người dùng hạ mức ưu tiên quy trình của họ, hãy xem câu trả lời của Flup .


1
À! Vì vậy, nó là cấu hình! OK, điều đó có ý nghĩa hơn, cảm ơn.
terdon

"các giá trị từ 0 đến 40. [...] Bạn sẽ nhận thấy giá trị mặc định là 20 trên ubfox 10.04 và 0 trong Debian jessie chẳng hạn." -> Thú vị, những vết loét cứng / mềm đối với tôi thực sự là 0 trên debian jessie. Tôi có thể tăng tới 20 nhưng ngoài ra tôi nhận được "bash: ulimit: lên lịch ưu tiên: không thể sửa đổi giới hạn: Đối số không hợp lệ", các giá trị âm cũng không được chấp nhận.
thomanski

20

Đó là vì những gì tôi gọi là lý do chính sách . Ý tưởng là người dùng bình thường không thể ghi đè lên hành động của người dùng đặc quyền.

Giả sử bạn là người dùng trên một số máy chủ được chia sẻ lớn. Bạn đang chạy các quy trình ngốn CPU khủng khiếp để gây bất lợi cho những người dùng khác. Sysadmin renicelà một số quy trình của bạn bởi vì anh ấy không thích bạn lắm. HĐH không nhớ ai đã làm renice, nhưng họ biết rằng người dùng bình thường không thể đảo ngược hành động. Theo cách này, sysadmin có quyền kiểm soát các ưu tiên quy trình của người dùng thông thường.


1
Tôi có thể hiểu điều đó nhưng nó vẫn có vẻ lạ. Trong thực tế, tôi chỉ nhận ra rằng nó thậm chí được liệt kê là một lỗi trong man renice.
terdon

3
Tôi nghĩ rằng vấn đề của lỗi là 'Không phải siêu người dùng không thể tăng mức độ ưu tiên lên lịch cho các quy trình của riêng họ, ngay cả khi họ là những người giảm mức độ ưu tiên ngay từ đầu '. tức là đó là một tác dụng phụ của việc thực thi này mà một sự tình cờ renicekhông thể đảo ngược được ngoại trừ bởi một người dùng đặc quyền.
Flup

7
Bởi vì hệ thống không nhớ ai đặt ưu tiên. Lý tưởng nhất là nếu bạn tăng mức độ tốt và sau đó muốn hạ xuống, điều đó sẽ được cho phép ... nhưng hệ thống áp đặt chính xác lệnh cấm chăn vì nó không lưu giữ hồ sơ về ai đã làm gì, vì vậy bạn không thể hoàn tác reniceđiều đó rootđã làm
Flup

1
@IwillnotexistIdonotexist nghĩ về các hệ thống có nhiều người dùng. Sysadmin có thể muốn tăng mức độ ưu tiên của các quy trình của bạn lên 5 và hạ thấp các quy trình của tôi xuống 10. Điều đó vẫn nằm trong phạm vi người dùng bình thường nhưng tôi sẽ không thể thay đổi và đánh cắp thời gian CPU mà bạn xứng đáng. Dù sao đó cũng là ý tưởng như Flup đã giải thích. Tuy nhiên, như StephaneChazelas đã giải thích , đây là cấu hình để tùy thuộc vào sysadmin để chọn những gì họ thích.
terdon

1
Câu trả lời cho câu hỏi tại sao? Chỉ đơn giản là có khả năng là vì vì không ai cần nó đủ để viết mã để sửa nó. Từ khi Unix được viết ban đầu, việc theo dõi ai đặt mức độ ưu tiên của quy trình có thể rất tốn kém về mặt sử dụng bộ nhớ và làm việc để cập nhật nó, nhưng về máy móc hiện đại, đó là không đáng kể, chỉ để lại thiếu động lực để viết mã để theo dõi này cho các trang web muốn giữ chính sách ban đầu của “người dùng không thể ghi đè lên sysadmin.”
alanc

-1

Lạ nhỉ? nó làm việc cho tôi trên

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

thí dụ

$ 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

Chỉnh sửa lần 2

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

Thay đổi cấu hình

/etc/security/limits.conf

@audio          -       rtprio          100
@audio          -       nice            -10

Và tôi là thành viên của nhóm âm thanh, điều này là để giảm độ trễ với jack / ardor và bộ đệm xsl khi ghi.

Lại đẹp

$ renice --version
renice from util-linux-ng 2.17.2

Bạn đang ở đâu? nó không có trên AIX 6.2
Kiwy

Xin vui lòng gửi đầu ra cat /etc/lsb*renice --versionlà tốt.
terdon

renice --version renice from util-linux-ng 2.17.2nhưng vẫn trên AIX, điều đó là không thể
Kiwy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.