2011-10-03 13 views
6

मेरा प्रोग्राम लिनक्स सिस्टम कॉल setpriority() का उपयोग कर रहे धागे की प्राथमिकताओं को बदलने के लिए कर रहा है। इसे नकारात्मक प्राथमिकताओं (-10) को सेट करने की आवश्यकता है, लेकिन जैसा कि दस्तावेज पर बताया गया है, यह सामान्य उपयोगकर्ता के रूप में चलाने पर विफल रहता है।एक लिनक्स उपयोगकर्ता को CAP_SYS_NICE क्षमता कैसे सेट करें?

उपयोगकर्ता को CAP_SYS_NICE की आवश्यकता है जो प्राथमिकताएं सेट करने में सक्षम होने की क्षमता है, लेकिन मुझे नहीं पता कि उपयोगकर्ता को ऐसी क्षमता कैसे दी जाए।

तो मेरा प्रश्न: लिनक्स उपयोगकर्ता को CAP_SYS_NICE क्षमता कैसे सेट करें?

+0

नाइस -10 उच्च प्राथमिकता है, लेकिन निश्चित रूप से दूरस्थ रूप से वास्तविक समय भी कुछ भी नहीं है। –

+0

यह केवल एक सूचक है, इसलिए मैं एक टिप्पणी जोड़ता हूं: यह उत्तर जांचें: http://stackoverflow.com/a/17685265/6899 – tzot

उत्तर

2

जन ह्यूडेक सही है कि एक प्रक्रिया केवल खुद को एक क्षमता नहीं दे सकती है, और एक सेटुइड रैपर क्षमता प्राप्त करने का स्पष्ट तरीका है। साथ ही, ध्यान रखें कि जब आप रूट छोड़ते हैं तो आपको prctl(PR_SET_KEEPCAPS, ...) की आवश्यकता होगी। (विवरण के लिए prctl मैन पेज देखें।) अन्यथा, जब आप अपने गैर रूट रूट उपयोगकर्ता आईडी में संक्रमण करते हैं तो आप क्षमता को छोड़ देंगे।

आप वास्तव में सिर्फ एक अलग अनुमति अच्छा स्तर के साथ उपयोगकर्ता सत्र लॉन्च करना चाहते हैं, तो आप pam_limits और limits.conf आदमी पृष्ठ दिखाई दें, के रूप में pam_limits मॉड्यूल आप हार्ड अच्छा सीमा बदलने के लिए अनुमति देता है। यह एक लाइन की तरह हो सकता है:

yourspecialusername hard nice -10 
+2

मुझे पता है कि यह उत्तर गंदगी से बड़ा है लेकिन pam_cap.so मॉड्यूल है जो पढ़ेगा '/ etc/security/capability.conf' और सेट क्षमताओं के अनुसार – Bratchley

0

AFAIK क्षमता प्राप्त करना संभव नहीं है। रूट प्रक्रियाओं में सभी क्षमताएं होती हैं और उन्हें दे सकती हैं, लेकिन एक बार छोड़ दिया जाता है, उन्हें वापस नहीं लिया जा सकता है। तो आपको एक सूड-रूट रैपर की आवश्यकता होगी जो सभी अन्य क्षमताओं को छोड़ देगी और प्रक्रिया को चलाएगी।

0

के बारे में sudo, मैं इस तरह उपयोगकर्ता कहा:

niceuser ALL=NOPASSWD:/usr/bin/nice 

और फिर यह ठीक काम किया:

[email protected] $ nice 
0 
[email protected] $ sudo nice -n -10 nice 
-10 
4

एक अच्छा काम उपयोगिता नहीं है बाइनरी पर क्षमताओं को सेट करने के लिए: सेट कैप। इसे आपके एप्लिकेशन बाइनरी पर रूट के रूप में चलाने की आवश्यकता है, लेकिन एक बार सेट होने पर, सामान्य उपयोगकर्ता के रूप में चलाया जा सकता है। उदाहरण:

$ sudo setcap 'cap_sys_nice=eip' <application> 

आप getcap का उपयोग कर पुष्टि कर सकते हैं कि क्या क्षमताओं एक आवेदन पर हैं:

$ getcap <application> 
<application> = cap_sys_nice+eip 

मैं स्थापित लाइन है, जो आमतौर किसी भी तरह रूट के रूप में चलाया जाता है में अपने makefile में क्षमताओं को एकीकृत सुझाव देंगे । ध्यान दें कि क्षमताओं को एक टीएआर फ़ाइल या किसी व्युत्पन्न पैकेज प्रारूप में संग्रहीत नहीं किया जा सकता है। यदि आप बाद में अपने आवेदन को पैकेज करते हैं, तो तैनाती पर क्षमता लागू करने के लिए आपको एक स्क्रिप्ट (डेबियन पैकेज के लिए पोस्टइंस्ट) की आवश्यकता होगी।

+0

आपका आदेश काम करता है, लेकिन क्या मैं पूछ सकता हूं कि आपको 'cap_sys_nice = eip', विशेष रूप से' = eip' भाग 'कहां मिला? मैं इसे 'मैन क्षमताओं' में 'मैन सेटकेप' में नहीं देख सकता हूं। – elmicha

+1

@elmicha कम से कम मेरे सिस्टम पर, मैन सेटकैप पेज में निम्न पंक्ति होती है: _ क्षमताओं को cap_from_text (3) _ में वर्णित रूप में निर्दिष्ट किया गया है। ध्यान दें कि cap_from_text मैनपृष्ठ डिफ़ॉल्ट रूप से उपलब्ध नहीं हो सकता है (भले ही आपके पास सेटकैप हो)।उदाहरण के लिए CentOS पर, यह libcap-devel पैकेज में उपलब्ध है। यह अतिरिक्त अक्षरों को 'ऑपरेटर झंडे' के रूप में वर्णित करता है, जहां ई = प्रभावी, i = विरासत योग्य और पी = अनुमत क्रमशः। –

संबंधित मुद्दे