ฉันสามารถเปลี่ยนเส้นทางผลลัพธ์ไปยังล็อกไฟล์และสร้างกระบวนการในเวลาเดียวกันได้หรือไม่?


116

ฉันสามารถเปลี่ยนเส้นทางผลลัพธ์ไปยังล็อกไฟล์และสร้างกระบวนการในเวลาเดียวกันได้หรือไม่?

กล่าวอีกนัยหนึ่งฉันสามารถทำสิ่งนี้ได้ไหม

nohup java -jar myProgram.jar 2>&1 > output.log &

หรือว่าไม่ใช่คำสั่งทางกฎหมาย? หรือฉันต้องย้ายมันไปที่พื้นหลังด้วยตนเองเช่น:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1

2
คุณเคยลองไหม คุณได้รับข้อผิดพลาดอะไร นอกจากนี้ฉันไม่แน่ใจว่าคุณพิมพ์ผิดหรือมีข้อผิดพลาดในรหัสของคุณ อาจจะควรจะเป็น2>$1 2>&1
Patrick

คำตอบ:


171

ปัญหาหนึ่งของคำสั่งแรกคือคุณเปลี่ยนเส้นทาง stderr ไปยังตำแหน่งที่ stdout คือ (ถ้าคุณเปลี่ยน $ เป็น & ตามที่แนะนำในความคิดเห็น) จากนั้นคุณเปลี่ยนเส้นทาง stdout ไปยังไฟล์บันทึก แต่ไม่ดึง stderr ที่เปลี่ยนเส้นทาง . คุณต้องทำตามลำดับอื่นก่อนอื่นให้ส่ง stdout ไปยังตำแหน่งที่คุณต้องการแล้วส่ง stderr ไปยังที่อยู่ stdout ที่อยู่ที่

some_cmd > some_file 2>&1 &

จากนั้นคุณสามารถ & & ส่งเพื่อส่งไปที่พื้นหลัง งานสามารถเข้าถึงได้ด้วยjobsคำสั่ง jobsจะแสดงงานที่กำลังดำเนินอยู่และให้หมายเลขแก่คุณ จากนั้นคุณสามารถพูดคุยเกี่ยวกับงานโดยใช้% ตามด้วยหมายเลขที่ชอบkill %1หรือดังนั้น

นอกจากนี้หากไม่มี & ในตอนท้ายคุณสามารถระงับคำสั่งด้วยCtrlzให้ใช้bgคำสั่งเพื่อวางไว้ในพื้นหลังและfgนำกลับมาที่พื้นหน้า ร่วมกับjobsคำสั่งนี้มีประสิทธิภาพ

เพื่อชี้แจงส่วนด้านบนเกี่ยวกับลำดับที่คุณเขียนคำสั่ง สมมติว่า stderr คือที่อยู่ 1002, stdout คือที่อยู่ 1001 และไฟล์คือ 1008 คำสั่งอ่านจากซ้ายไปขวาดังนั้นสิ่งแรกที่เห็นในของคุณคือการ2>&1ย้าย stderr ไปยังที่อยู่ 1001 จากนั้นดู> fileที่ย้าย stdout ไปที่ 1008 แต่คง stderr ที่ 1001 มันไม่ได้ดึงทุกอย่างที่ชี้ไปที่ 1001 และย้ายไปที่ 1008 แต่เพียงแค่อ้างอิง stdout และย้ายไปที่ไฟล์
อีกวิธีหนึ่งคือ stdout ย้ายไปที่ 1008 แล้วย้าย stderr ไปยังจุดที่ stdout ชี้ไปที่ 1008 เช่นกัน วิธีนี้ทั้งคู่สามารถชี้ไปที่ไฟล์เดียว


ดูเหมือนจะไม่สามารถจับ pid ได้หลังจากนี้ด้วย$!
chovy

8
นอกจากนี้ยังมีข้อควรจำ: คุณสามารถใช้&> file.outเพื่อเปลี่ยนเส้นทางทั้ง stdin และ stdout ไปยังไฟล์เอาต์พุตซึ่งลดความเป็นไปได้ของข้อผิดพลาดด้วยการใส่2>&1ผิดที่ในบรรทัดคำสั่งของคุณ
Dan

14

การหยุดด้วย<Ctrl+Z>และดำเนินการต่อในพื้นหลังด้วยbgจะเทียบเท่ากับการดำเนินการกับ&ที่ส่วนท้ายของคำสั่ง

ดังนั้นสำหรับรันในพื้นหลังและเปลี่ยนเส้นทางผลลัพธ์:

java -jar myProgram.jar 2> errorOutput.log > output.log &

หากคุณต้องการให้คำสั่งนี้ไม่ตายเมื่อคุณออกจากเทอร์มินัลคุณควรใช้ nohup


อ้อเข้าใจแล้ว. คุณกำลังพูดว่าอักขระ '&' ที่ต่อท้ายซ้ำซ้อนหรือไม่
djangofan

ฉันแค่อ้าง manpage เนื่องจาก nohup จะดำเนินการคำสั่งในพื้นหลังต่อไปดูเหมือนว่าซ้ำซ้อนในการดำเนินการ nohup ตัวเองในพื้นหลัง
RSFalcon7

10
nohup ไม่ดำเนินการคำสั่งในพื้นหลังที่คุณต้องผนวกชัดเจน&
jlliagre

3
หลังจากที่คุณย้ายกระบวนการไปที่พื้นหลังด้วยbgคุณสามารถแยกออกจากเซสชันของคุณโดยการเรียกใช้disownซึ่งทำให้กระบวนการไม่ตายเมื่อคุณปิดเทอร์มินัล
โคเอ็น

14
java -jar myProgram.jar &> output.log &

โปรดทราบว่าจะ&>นำทั้ง stdout และ stderr ไปยัง output.log


3
คำอธิบายแบบบรรทัดเดียวจะทำให้คำตอบสมบูรณ์
anaik

2
@ abhisheknaik96 มันรันไฟล์ jar และเปลี่ยนเส้นทางทั้ง stdin และ stderr ไปยัง output.log และทำให้กระบวนการเป็นพื้นหลัง
P Pang

2

แทนที่จะใช้ nohup คุณสามารถใช้หน้าจอ คุณสามารถดูสถานะของโปรแกรมในเวลาจริง คุณสามารถบันทึกผลลัพธ์ทั้งหมดไปยังไฟล์ได้ มันจะมีประโยชน์เมื่อคุณเข้าถึงเซิร์ฟเวอร์ผ่านทาง ssh ที่คุณได้ออกจากระบบเนื่องจากการเชื่อมต่อที่ไม่ดีหรือไม่มีการใช้งาน หลังจากเข้าสู่ระบบคุณสามารถทำงานต่อจากที่ที่คุณออกไป อ้างอิงสิ่งนี้และสิ่งนี้เพื่อทราบรายละเอียด


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