bash - बैश स्क्रिप्ट से कंट्रोल+सी कैसे भेजें?




gnu-screen (3)

आप निम्न आदेशों का उपयोग करके MySQL की तरह एक विशेष प्रक्रिया की PID प्राप्त कर सकते हैं: ps -e | pgrep mysql

यह कमांड आपको MySQL rocess की PID देगा। जैसे, 13954 अब, टर्मिनल पर निम्न कमांड टाइप करें। किल -9 13954 यह MySQL की प्रक्रिया को मार देगा।

मैं बैश स्क्रिप्ट में कई स्क्रीन शुरू कर रहा हूं, फिर उनमें से प्रत्येक में django की runserver कमांड चला रहा हूं। मैं प्रोग्राम के रूप में अच्छी तरह से उन सभी को रोकने में सक्षम होना चाहता हूं, जिससे मुझे runserver Control+c भेजने की आवश्यकता होती है।

मैं अपनी बैश स्क्रिप्ट से ये कीस्ट्रोक्स कैसे भेज सकता हूं?


CTRL-C आम तौर पर प्रक्रिया को एक संकेत भेजता है ताकि आप बस कर सकें:

kill -INT <processID>

विशिष्ट processID को प्रभावित करने के लिए कमांड लाइन (या स्क्रिप्ट) से।

मैं कहता हूं "आम तौर पर" क्योंकि अधिकांश UNIX के साथ, यह असीम रूप से कॉन्फ़िगर करने योग्य है। यदि आप stty -a निष्पादित stty -a , तो आप देख सकते हैं कि stty -a किस कुंजी अनुक्रम से बंधा है। यह शायद CTRL-C होगा, लेकिन यह महत्वपूर्ण अनुक्रम पूरी तरह से किसी और चीज़ के लिए मैप किया जा सकता है।

निम्न स्क्रिप्ट इसे कार्रवाई में दिखाती है (हालांकि TERM साथ INT बजाय क्योंकि sleep मेरे वातावरण में INT प्रतिक्रिया नहीं करती है):

#!/usr/bin/env bash

sleep 3600 &
pid=$!
sleep 5

echo ===
echo PID is $pid, before kill:
ps -ef | grep -E "PPID|$pid" | sed 's/^/   /'
echo ===

( kill -TERM $pid ) 2>&1
sleep 5

echo ===
echo PID is $pid, after kill:
ps -ef | grep -E "PPID|$pid" | sed 's/^/   /'
echo ===

यह मूल रूप से एक घंटे की sleep प्रक्रिया शुरू करता है और इसकी प्रक्रिया आईडी को पकड़ लेता है। यह तब प्रक्रिया को मारने से पहले संबंधित प्रक्रिया विवरण को आउटपुट करता है।

एक छोटे से इंतजार के बाद, यह प्रक्रिया तालिका की जांच करता है कि क्या प्रक्रिया चली गई है। जैसा कि आप स्क्रिप्ट के आउटपुट से देख सकते हैं, यह वास्तव में चला गया है:

===
PID is 28380, before kill:
   UID   PID     PPID    TTY     STIME      COMMAND
   pax   28380   24652   tty42   09:26:49   /bin/sleep
===
./qq.sh: line 12: 28380 Terminated              sleep 3600
===
PID is 28380, after kill:
   UID   PID     PPID    TTY     STIME      COMMAND
===

    pgrep -f process_name > any_file_name
    sed -i 's/^/kill /' any_file_name
    chmod 777 any_file_name
    ./any_file_name

उदाहरण के लिए 'pgrep -f फ़ायरफ़ॉक्स' 'फ़ायरफ़ॉक्स' चलाने के PID को टाल देगा और 'PID को' any_file_name 'नामक फ़ाइल में सहेज देगा। f sed ’कमांड ile any_file_name’ फ़ाइल में PID नंबर की शुरुआत में 'किल ’को जोड़ेगी। तीसरी पंक्ति 'any_file_name' फ़ाइल को निष्पादन योग्य बनाएगी। अब आगे की लाइन 'any_file_name' फ़ाइल में उपलब्ध PID को मार देगी। किसी फ़ाइल में उपरोक्त चार पंक्तियों को लिखना और उस फ़ाइल को निष्पादित करना, नियंत्रण-सी कर सकता है। मेरे लिए बिल्कुल ठीक काम करना।





gnu-screen