मेरे पास एक पर्ल स्क्रिप्ट है, script.pl जो, जब चलती है, एक कांटा करता है, पैरेंट प्रक्रिया एक फ़ाइल में अपनी पिड आउटपुट करती है तो बच्चे की प्रक्रिया के दौरान बाहर निकलती है स्टट करने के लिए कुछ आउटपुट करता है और फिर थोड़ी देर लूप में जाता है।perl कांटा दूरस्थ रूप से चलाते समय ठीक से काम नहीं करता है (एसएसएच के माध्यम से)
$pid = fork();
if (! defined $pid)
{
die "Failed to fork.";
}
#Parent process
elsif($pid)
{
if(!open (PID, ">>running_PIDs"))
{
warn "Error opening file to append PID";
}
print PID "$pid \n";
close PID;
}
#child process
else
{
print "Output started";
while($loopControl)
{
#Do some stuff
}
}
यह ठीक काम करता है जब मैं इसे स्थानीय रूप से कहता हूं यानी: perl script.pl।
स्क्रिप्ट कुछ चीजों को प्रिंट करता है फिर शेल पर नियंत्रण वापस लौटाता है। (जबकि बाल प्रक्रिया पृष्ठभूमि में अपने लूप में बंद हो जाती है)।
हालांकि, जब मैं ssh नियंत्रण के माध्यम से इस फोन वापस कभी नहीं खोल में लौट आता है (और न ही "आउटपुट शुरू कर दिया" रेखा कभी मुद्रित है
अर्थात्:। $ ssh [email protected] 'पर्ल स्क्रिप्ट। pl '
हालांकि, दिलचस्प बात यह है, बच्चे प्रक्रिया को चलाने (मैं इसे जब मैं ps टाइप देख सकते हैं) है
किसी को क्या
संपादित हो रहा व्याख्या कर सकते हैं:।?
मैंने इसे डीबग के तहत चलाया और इसे मिला:
### फोर्क किया गया, लेकिन यह नहीं पता कि एक नया टीटीई कैसे बनाया जाए।चूंकि दो डिबगर्स एक ही टीटीवी के लिए लड़ते हैं, इनपुट गंभीर रूप से उलझा हुआ है।
मुझे पता है कि आउटपुट को xterms और ओएस/2 कंसोल में केवल एक अलग विंडो में कैसे स्विच करें। मैन्युअल स्विच के लिए, $ DB :: fork_TTY में बनाए गए TTY का नाम दें, या इसे वापस करने वाले फ़ंक्शन डीबी :: get_fork_TTY() को परिभाषित करें।
यूनिक्स सिस्टम पर एक tty लिखकर दिया खिड़की के लिए एक TTY के नाम प्राप्त कर सकते हैं, और नींद से TTY से खोल डिस्कनेक्ट 1000000.
अगर किसी के पास 'स्क्रीन' के अलावा इस समस्या का समाधान है (जो कि मैं हमेशा उपलब्ध नहीं हूं), तो मुझे इसे देखना अच्छा लगेगा। – mob