วิธีเรียกใช้โปรเซสและแยกเชลล์พาเรนต์ออกทั้งหมด [ซ้ำ]


3

ซ้ำกันได้:
ปล่อยให้สคริปต์ทุบตีทำงานใน terminal ระยะไกลในขณะที่ไม่ได้เข้าสู่ระบบ?
ฉันจะแยกกระบวนการออกจากเทอร์มินัลได้อย่างไร

ฉันใช้งานโปรแกรมบนเซิร์ฟเวอร์ linux ซึ่งใช้เวลาหลายวันกว่าจะเสร็จสมบูรณ์

ฉันเปิดมันจากเวิร์กสเตชันของฉันจาก terminal SSH เนื่องจากโปรแกรมนี้เป็นบรรทัดคำสั่งเท่านั้น

ฉันต้องการที่จะสามารถทำสิ่งเหล่านี้ทั้งหมด:

  • เปิดตัวโปรแกรมนั้น
  • เปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปยังไฟล์
  • ออกจากเซสชัน SSH ของฉันโดยไม่ทำให้ขั้นตอนนี้ยุติลง

ฉันคิดเกี่ยวกับ $ ./MyProg.csh -params -foo -bar </dev/null 1>~/out.log 2>~/err.log &

อย่างไรก็ตามกระบวนการจะสิ้นสุดลงเมื่อฉันปิดเซสชัน SSH ของฉัน เวิร์กสเตชันของฉันใช้ Windows XP และฉันไม่สามารถรับประกันเวลาที่ใช้งานได้ในช่วงเวลาหลายวันซึ่งจำเป็นสำหรับการประมวลผลข้อมูลของฉันบนเซิร์ฟเวอร์ Linux

ตามที่คุณอาจสังเกตเห็นโปรแกรมของฉันต้องเปิดตัวจาก CSH

เป็นไปได้ที่จะทำเช่นนี้?

ขอบคุณ

คำตอบ:


8

คุณสามารถเป็นผู้ใช้ screen หรือ nohup

ถ้าคุณเลือก screen :

เปิด screen ก่อนที่คุณจะเรียกใช้บริการของคุณ:

$ screen

จากนั้นเรียกใช้บริการของคุณภายใน screen:

./MyProg.sh > myprog.log (หรืออะไรก็ได้ที่คุณต้องการที่นี่)

แล้ว Ctrl + d

เมื่อคุณกลับมาเพียง:

$ screen -r

สำหรับข้อมูลเพิ่มเติม: http://www.gnu.org/s/screen/


เกี่ยวกับ nohup: เพียง:

nohup ./MyProg.sh > myprog.log &


น่ากลัว! ฉันรู้ว่าฉันสามารถจัดการการใช้ screen แต่ฉันไม่สามารถผ่านมันไปได้ นี่มันยอดเยี่ยมธรรมดาขอบคุณมาก!
Benoit Duffez

ฉันคิดว่าคำสั่ง "ปฏิเสธ" จะทำสิ่งที่เขาขอให้ ....
Erik Aronesty

1

ทำเปลือก wrapper เช่นนี้

#!/bin/sh
exec </dev/null
exec >> ~/out.log
exec 2>> ~/err.log
exec setsid ./MyProg.csh -params -foo -bar

หากคุณต้องการไฟล์ PID ให้ส่งเชลล์สคริปต์นี้ไปที่ bg และอ่าน $! (PID ของกระบวนการ bg ล่าสุด) คุณสามารถทำได้โดยใช้ subshell ด้วย () ในสคริปต์เดียวกันเช่นนี้:

#!/bin/sh
( exec </dev/null
  exec >> ~/out.log
  exec 2>> ~/err.log
  exec setsid ./MyProg.csh -params -foo -bar
) &
kill -0 $! > /dev/null 2>&1 || exit 1
echo $! > program.pid
exit 0

0

การเชื่อมต่อลดลงเนื่องจากเชลล์ส่ง SIGHUP ไปยังลูกทั้งหมดเมื่อออก หากคุณใช้ bash หรือ zsh คุณสามารถใช้ disown และเชลล์จะไม่ส่ง SIGHUP อีกต่อไปและกระบวนการจะอยู่รอบ ๆ

screen และ setsid ใช้งานได้ดีกว่า แต่คำตอบนี้มีข้อดีคือไม่ต้องจำหน้าจอก่อนที่จะเริ่มทำ screen มีพลังมากมายนอกเหนือจากนี้ดังนั้นคุณอาจต้องการใช้มันให้เป็นนิสัย


ผม มี เพื่อใช้ csh
Benoit Duffez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.