<Pid> के साथ एक प्रक्रिया का वर्तमान umask


11

क्या किसी प्रक्रिया का वर्तमान umask प्राप्त करना संभव है? से /proc/<pid>/...उदाहरण के लिए?


1
अगर आप gdb का उपयोग करके दिल से बेहोश नहीं हैं, तो इस infor को प्राप्त करने का कोई ऐसा उपयोगकर्ता-अनुकूल तरीका नहीं है: stackoverflow.com/questions/165212/…
MelBurslan

जवाबों:


21

लिनक्स कर्नेल 4.7 ( कमिट ) के साथ, umask में उपलब्ध है /proc/<pid>/status

$ grep '^Umask:' "/proc/$$/status"
Umask:  0022

1
इससे RHEL 7.4 में मदद मिली!
आनंद वर्की फिलिप्स

हां, और RHEL7.4 3.10.0 है, इसलिए मुझे 4.7 के बारे में टिप्पणी समझ में नहीं आती है।
हैगेलो

ठीक है, कुछ पुराने गुठली umask के बारे में जानकारी प्रदान नहीं करते हैं, उदाहरण के लिए 2.6.18। हालाँकि, फ़ीचर पहले से ही 3.10.0 में है। इस प्रकार, आपको यह नहीं कहना चाहिए कि यह समाधान कर्नेल 4.7 से पहले काम नहीं करता है।
हैगेलो

स्टीफन मेरी पोस्ट को कमिट करने के लिए संपादित करने के लिए पर्याप्त था जो स्पष्ट रूप से कहता है कि जब इसे जोड़ा गया था, तो यह 3.10 की तुलना में बहुत नया है। शायद यह आरएचईएल के पैचेड कर्नेल में बहुत पहले दिखाई दिया था, लेकिन अभी तक मेनलाइन कर्नेल में नहीं है, मुझे नहीं पता।
एग्मोंट

15

नोट: यह उत्तर लिनक्स कर्नेल 4.6 और पहले के संस्करण पर लागू होता है। कर्नेल के नए संस्करणों के लिए @ egmont का उत्तर देखें ।

यूमस्क को घोषणा में उजागर नहीं किया गया है। बहुत अधिक सफलता के बिना इसे जोड़ने का प्रयास किया गया था ।

Umask का उपयोग करने का तरीका है gdb, जैसा कि पहले यहां बताया जा चुका है :

$ gdb --pid=4321
(gdb) call/o umask(0)
$1 = 077
(gdb) call umask($1)
$3 = 0

ध्यान रखें कि gdb प्रक्रिया और उसके थ्रेड्स को रोकता है, इसलिए umask का अस्थायी परिवर्तन नगण्य है।

यदि आपके मामले के लिए यह अच्छा है, तो आप इस ऑनलाइनर का उपयोग कर सकते हैं:

$ gdb --batch -ex 'call/o umask(0)' -ex 'call umask($1)' --pid=4321 2> /dev/null | awk '$1 == "$1" {print $3}'
077

एक अन्य विकल्प है, यदि आप रनिंग प्रक्रिया को नियंत्रित कर सकते हैं, ओम्स्क को फाइल, आउटपुट या कुछ इसी तरह लिखने के लिए और इसे वहां से प्राप्त कर सकते हैं।


1
बस यह उत्तर उन शर्तों को भूल जाने पर भी दिखाई देता है, यह भी बताता है कि कैसे चल रही प्रक्रिया के umask को संशोधित करना है (क्योंकि इसे प्राप्त करने के लिए अस्थायी रूप से इसे बदलने की आवश्यकता होती है)। मैंने शुरुआत में इसे खोजते हुए खारिज कर दिया।
ह्यूजेस एम।

4

Linux पर, systemtap(as root), आप कर सकते हैं

stap -e 'probe kernel.function("do_task_stat") {
           printf("%o\n", $task->fs->umask);
           exit()
         }
         probe begin {system("cat /proc/4321/stat>/dev/null")}'

ऐसा cat /proc/4321/statकरने से उस जाँच को ट्रिगर किया do_task_statजा सकता है जहाँ हम fs->umaskसंबंधित प्रक्रिया के क्षेत्र तक पहुँच सकते हैं ' task_structकर्नेल में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.