Bash
नौकरियां और प्रक्रियाएं
खोज…
वर्तमान नौकरियों की सूची
$ tail -f /var/log/syslog > log.txt
[1]+ Stopped tail -f /var/log/syslog > log.txt
$ sleep 10 &
$ jobs
[1]+ Stopped tail -f /var/log/syslog > log.txt
[2]- Running sleep 10 &
नौकरी संभालना
रोजगार पैदा करना
एक नौकरी बनाने के लिए, बस एक &
कमांड के बाद संलग्न करें:
$ sleep 10 &
[1] 20024
आप Ctrl + z दबाकर एक रनिंग प्रोसेस को भी काम बना सकते हैं:
$ sleep 10
^Z
[1]+ Stopped sleep 10
पृष्ठभूमि और अग्रभूमि एक प्रक्रिया
प्रक्रिया को अग्रभूमि में लाने के लिए, कमांड fg
का उपयोग %
साथ किया जाता है
$ sleep 10 &
[1] 20024
$ fg %1
sleep 10
अब आप प्रक्रिया के साथ बातचीत कर सकते हैं। इसे बैकग्राउंड में लाने के लिए आप bg
कमांड का उपयोग कर सकते हैं। अधिग्रहीत टर्मिनल सत्र के कारण, आपको पहले Ctrl + z दबाकर प्रक्रिया को रोकना होगा।
$ sleep 10
^Z
[1]+ Stopped sleep 10
$ bg %1
[1]+ sleep 10 &
कुछ प्रोग्रामर के आलस्य के कारण, ये सभी कमांड एक %
साथ भी काम करते हैं यदि केवल एक प्रक्रिया है, या सूची में पहली प्रक्रिया है। उदाहरण के लिए:
$ sleep 10 &
[1] 20024
$ fg % # to bring a process to foreground 'fg %' is also working.
sleep 10
या केवल
$ % # laziness knows no boundaries, '%' is also working.
sleep 10
इसके अतिरिक्त, बिना किसी तर्क के सिर्फ fg
या bg
टाइप करना अंतिम कार्य को संभालता है:
$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20
चल रही नौकरियां मारना
$ sleep 10 &
[1] 20024
$ kill %1
[1]+ Terminated sleep 10
नींद प्रक्रिया प्रक्रिया आईडी (पीआईडी) 20024
और नौकरी नंबर 1
साथ पृष्ठभूमि में चलती है। प्रक्रिया को संदर्भित करने के लिए, आप या तो पीआईडी या जॉब नंबर का उपयोग कर सकते हैं। यदि आप नौकरी संख्या का उपयोग करते हैं, तो आपको इसे %
साथ उपसर्ग करना होगा। डिफ़ॉल्ट मारने के द्वारा भेजे गए संकेत kill
है SIGTERM
है, जो लक्ष्य प्रक्रिया शान से बाहर निकलने के लिए अनुमति देता है।
कुछ आम मार संकेत नीचे दिखाए गए हैं। पूरी सूची देखने के लिए, kill -l
चलाएं।
संकेत नाम | संकेत मान | प्रभाव |
---|---|---|
SIGHUP | 1 | फोन रख देना |
SIGINT | 2 | कीबोर्ड से इंटरप्ट |
SIGKILL | 9 | मारने का संकेत |
SIGTERM | 15 | समाप्ति संकेत |
विशिष्ट प्रक्रियाओं को शुरू करना और मारना
संभवतः रनिंग प्रक्रिया को मारने का सबसे आसान तरीका प्रक्रिया नाम के माध्यम से इसे चुनना है जैसा कि निम्नलिखित उदाहरण में pkill
कमांड का उपयोग करके किया गया है
pkill -f test.py
(या) वास्तविक प्रक्रिया-आईडी की खोज करने के लिए pgrep
का उपयोग करके अधिक मूर्ख-प्रूफ तरीका
kill $(pgrep -f 'python test.py')
ps -ef | grep name_of_process
पर grep
का उपयोग करके एक ही परिणाम प्राप्त किया जा सकता है ps -ef | grep name_of_process
फिर परिणामस्वरूप पीआईडी (प्रोसेस आईडी) से जुड़ी प्रक्रिया को मार रहा है। अपने नाम का उपयोग करते हुए एक प्रक्रिया का चयन करना एक परीक्षण वातावरण में आश्वस्त है, लेकिन वास्तव में खतरनाक हो सकता है जब स्क्रिप्ट का उपयोग उत्पादन में किया जाता है: यह सुनिश्चित करना लगभग असंभव है कि नाम उस प्रक्रिया से मेल खाएगा जो आप वास्तव में मारना चाहते हैं। उन मामलों में, निम्नलिखित दृष्टिकोण वास्तव में बहुत सुरक्षित है।
स्क्रिप्ट शुरू करें जो अंततः निम्नलिखित दृष्टिकोण के साथ मारे जाएंगे। चलिए मान लेते हैं कि जिस कमांड को आप निष्पादित करना चाहते हैं और अंततः मारना है, वह है python test.py
#!/bin/bash
if [[ ! -e /tmp/test.py.pid ]]; then # Check if the file already exists
python test.py & #+and if so do not run another process.
echo $! > /tmp/test.py.pid
else
echo -n "ERROR: The process is already running with pid "
cat /tmp/test.py.pid
echo
fi
यह /tmp
डायरेक्टरी में एक फाइल बनाएगा, जिसमें python test.py
प्रक्रिया के पीआईडी python test.py
। यदि फ़ाइल पहले से मौजूद है, तो हम मानते हैं कि कमांड पहले से ही चल रही है और स्क्रिप्ट में कोई त्रुटि है।
फिर, जब आप इसे मारना चाहें तो निम्न स्क्रिप्ट का उपयोग करें:
#!/bin/bash
if [[ -e /tmp/test.py.pid ]]; then # If the file do not exists, then the
kill `cat /tmp/test.py.pid` #+the process is not running. Useless
rm /tmp/test.py.pid #+trying to kill it.
else
echo "test.py is not running"
fi
यह किसी भी अस्थिर जानकारी (जैसे कमांड चलाने के लिए उपयोग की जाने वाली स्ट्रिंग) पर भरोसा किए बिना, आपकी कमांड से जुड़ी प्रक्रिया को मार डालेगा। इस मामले में भी यदि फ़ाइल मौजूद नहीं है, तो स्क्रिप्ट यह मानती है कि आप एक गैर-चल रही प्रक्रिया को मारना चाहते हैं।
इस अंतिम उदाहरण को एक ही कमांड को कई बार चलाने के लिए आसानी से सुधार किया जा सकता है (उदाहरण के लिए, इसे लिखने की बजाय पिड फ़ाइल में संलग्न करना) और उन मामलों का प्रबंधन करने के लिए जहां प्रक्रिया की मृत्यु होने से पहले मर जाता है।
सभी प्रक्रियाओं को सूचीबद्ध करें
किसी सिस्टम पर सभी प्रक्रियाओं को सूचीबद्ध करने के दो सामान्य तरीके हैं। दोनों सभी उपयोगकर्ताओं द्वारा चलने वाली सभी प्रक्रियाओं को सूचीबद्ध करते हैं, हालांकि वे उस प्रारूप में भिन्न होते हैं जो वे आउटपुट करते हैं (अंतर का कारण ऐतिहासिक है)।
ps -ef # lists all processes
ps aux # lists all processes in alternative format (BSD)
यह जांचने के लिए इस्तेमाल किया जा सकता है कि क्या कोई दिया गया आवेदन चल रहा है। उदाहरण के लिए, यह जाँचने के लिए कि SSH सर्वर (sshd) चल रहा है:
ps -ef | grep sshd
जाँचें कि कौन सी प्रक्रिया विशिष्ट पोर्ट पर चल रही है
यह जांचने के लिए कि 8080 पोर्ट पर कौन सी प्रक्रिया चल रही है
lsof -i :8080
चल रही प्रक्रिया के बारे में जानकारी प्राप्त करना
ps aux | grep <search-term>
खोज-खोज से मेल खाती प्रक्रियाओं को दर्शाता है
उदाहरण:
root@server7:~# ps aux | grep nginx
root 315 0.0 0.3 144392 1020 ? Ss May28 0:00 nginx: master process /usr/sbin/nginx
www-data 5647 0.0 1.1 145124 3048 ? S Jul18 2:53 nginx: worker process
www-data 5648 0.0 0.1 144392 376 ? S Jul18 0:00 nginx: cache manager process
root 13134 0.0 0.3 4960 920 pts/0 S+ 14:33 0:00 grep --color=auto nginx
root@server7:~#
यहां, दूसरा कॉलम प्रक्रिया आईडी है। उदाहरण के लिए, यदि आप nginx प्रक्रिया को मारना चाहते हैं, तो आप kill 5647
कमांड kill 5647
उपयोग कर सकते हैं। यह हमेशा SIGKILL
बजाय SIGTERM
साथ kill
कमांड का उपयोग करने की सलाह दी SIGKILL
।
बैकग्राउंड जॉब डिसाइड करना
$ gzip extremelylargefile.txt &
$ bg
$ disown %1
यह आपके शेल (टर्मिनल, ssh, आदि) के बंद होने पर एक लंबी चलने वाली प्रक्रिया को जारी रखने की अनुमति देता है।