पृष्ठभूमि प्रक्रिया की गति को लिखने के लिए


25

मैं उबंटू 10.04 बॉक्स पर हूं, और ssh के बैकग्राउंड (myserver &) में एक सर्वर शुरू किया। यह ठीक चल रहा है, लेकिन मुझे सर्वर के स्टैडिन पर जाने के लिए एक रास्ता चाहिए, क्योंकि इस विधि के माध्यम से सर्वर को नियंत्रित करने का एकमात्र तरीका है।

क्या पहले से चल रही प्रक्रिया की गति को प्राप्त करने का कोई तरीका है, तो मैं इसे लिख सकता हूं (और उम्मीद है कि इसके स्टडआउट को पढ़ें)? जाहिर है, अगर मैं अब ऐसा करने जा रहा हूं, तो मैं इसे एक FIFO के साथ शुरू करूंगा, जिसे स्टड पर पुनर्निर्देशित किया जाएगा, लेकिन दुर्भाग्य से अब इसके लिए थोड़ी देर है।

कोई विचार?


क्या आप इसे केवल अग्रभूमि में वापस नहीं ला सकते थे? ('जॉब्स' आपकी वर्तमान पृष्ठभूमि प्रक्रिया को सूचीबद्ध करेगा, 'fg $ X' नौकरी को अग्रभूमि में वापस लाएगा, ctrl + b नौकरी को रोक देगा और आपको आपके शेल पर लौटा देगा, जबकि 'bg' रुकी हुई प्रक्रिया को जारी रखेगा) पृष्ठभूमि)
सिम्बियन

जवाबों:


10

आप इसे लिखने की कोशिश कर सकते हैं / पीआईडी ​​निर्देशिका खरीद सकते हैं। मान लीजिए कि आपके डेमोंस की पिड 2000 है, / proc / 2000 / fd / 0 लिखने की कोशिश करें


धन्यवाद ... मैंने पाया कि यह पोस्ट करने के ठीक बाद (एक दिन देखने के बाद - ठेठ)। यह काम करने लगता है (जहां तक ​​वास्तव में कार्यक्रम में डेटा भेजना है)। दुर्भाग्य से, कार्यक्रम आज्ञाओं को स्वीकार नहीं करता है। मैंने इसे अपने स्थानीय कंप्यूटर पर सर्वर चलाने का परीक्षण किया, और निश्चित रूप से पर्याप्त है, मुझे डेटा दिखाई देता है, लेकिन प्रोग्राम कमांड को नहीं पहचानता है। मुझे सर्वर टर्मिनल पर मैन्युअल रूप से प्रेस करना होगा, और फिर यह सिर्फ गैर-मान्यता प्राप्त आदेश कहता है। शायद कुछ जावा विचित्रता? मैं फंस गया हूँ ...
tajmorton

1
इको-ईई "समथिंग \ n"> / proc / 2000 / fd / 0 के बारे में कैसे?
katriel

वास्तव में, यह alway sworking के रूप में / proc / <pid> / fd / 0 अंक नहीं है / dev / pts <कुछ संख्या> कम से कम कुछ प्रणालियों पर ...
bk138

Serverfault.com/questions/178457/… का पहला जवाब है कि यह दृष्टिकोण वास्तव में काम नहीं करता है।
बैरीकेटर

2
यह वास्तव में काम नहीं करता है। आपका शेल सामान्य रूप से (जब कोई पाइप या पुनर्निर्देशन का उपयोग नहीं किया जाता है) फ़ाइल डिस्क्रिप्टर के साथ एक ही फ़ाइल पर सेट के 0माध्यम से एक कमांड शुरू 2करता है, जो सामान्य रूप से एक वर्चुअल टर्मिनल (कुछ ऐसा /dev/pty/...) है। इसके बाद कमांड एफडी से पढ़ता है 0और एफडी को लिखता है 1और 2वर्चुअल टर्मिनल (जैसे एसएसएच या सीधे अपने टर्मिनल एमुलेटर के साथ) के साथ संवाद करने के लिए। यदि कोई अन्य प्रक्रिया उस फ़ाइल (जैसे के माध्यम से /proc) तक पहुँचती है , तो ठीक यही बात होती है, अर्थात इसे लिखना टर्मिनल को लिखता है और कमांड को नहीं।
फ़्यूएर्मुरमेल

29

आप इसके इनपुट के रूप में एक नामित पाइप (फीफो) के साथ सर्वर शुरू कर सकते हैं:

mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &

cat > /tmp/srv-input &अपने सर्वर से बचने के लिए एक EOF प्राप्त करने के लिए महत्वपूर्ण है। कम से कम एक प्रक्रिया को लिखित रूप में खोला जाना चाहिए ताकि आपके सर्वर को ईओएफ प्राप्त न हो। इस कमांड के PID को /tmp/srv-input-cat-pidबाद की हत्या के लिए फ़ाइल में सहेजा गया है ।

आपके मामले में जहां आपने अपना सर्वर पहले ही शुरू कर दिया है, आपको डिबगर का उपयोग करना होगा जैसे कि gdbअपनी प्रक्रिया को संलग्न करने के लिए इसे पुनः निर्देशित करें stdin:

gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)

और फिर अपने सर्वर पर इनपुट भेजने के लिए bellow जैसा कुछ करें (यदि आवश्यक हो तो किसी अन्य टर्मिनल विंडो में):

echo "command" > /tmp/srv-input

अपने सर्वर को ईओएफ भेजने के लिए, आपको उस cat > /tmp/srv-inputप्रक्रिया को मारने की आवश्यकता है जिसे पीआईडी ​​में सहेजा गया है /tmp/srv-input-cat-pid file

GDB के मामले में, बस GDB और EOF को छोड़ दिया जाएगा।


1
यह एक बहुत अधिक पोर्टेबल दृष्टिकोण है, जैसे कि @katriel से / proc / 2000 / fd / 0 सभी प्रणालियों के लिए स्थिर नहीं है।
13:99 पर 13:99 पर पूर्व

"बिल्ली> / tmp / srv-input &" के साथ चाल ने मुझे कुछ सिरदर्द से बचाया। धन्यवाद!
13:99 पर 13:99 पर पूर्व

किस बारे में mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &? यह पाइप को भी खुला
रखेगा

@ bk138: यह मुझे दिखता है क्योंकि पूंछ को काम करना चाहिए, लेकिन यह सुनिश्चित करने के लिए केवल एक ही तरीका है: परीक्षण।
jfg956

tailकाम नहीं करता है, लेकिन यह काम खत्म करने के लिए जोड़ा गया: cat /tmp/srv-input | myserver; kill -9 बिल्ली / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat *
थियागो मैसेडोनो

4

ऊपर के समान, लेकिन 'बिल्ली' मेरे लिए काम नहीं करती थी। फ़ाइल को EOF मिला और एक आदेश भेजने के बाद समाप्त हो गया।

यह मेरे लिए काम किया:

#!/bin/bash

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