ฉันมีปัญหากับคำสั่ง nohup
เมื่อฉันทำงานฉันมีข้อมูลมากมาย nohup.out เอาต์พุตมีขนาดใหญ่เกินไปและกระบวนการของฉันช้าลง ฉันจะรันคำสั่งนี้โดยไม่รับ nohup.out ได้อย่างไร?
ฉันมีปัญหากับคำสั่ง nohup
เมื่อฉันทำงานฉันมีข้อมูลมากมาย nohup.out เอาต์พุตมีขนาดใหญ่เกินไปและกระบวนการของฉันช้าลง ฉันจะรันคำสั่งนี้โดยไม่รับ nohup.out ได้อย่างไร?
คำตอบ:
nohup
คำสั่งเพียงเขียนไปnohup.out
ถ้าการส่งออกมิฉะนั้นจะไปยังสถานี หากคุณเปลี่ยนเส้นทางผลลัพธ์ของคำสั่งที่อื่น - รวมถึง/dev/null
- นั่นคือสิ่งที่มันจะไปแทน
nohup command >/dev/null 2>&1 # doesn't create nohup.out
หากคุณกำลังใช้nohup
นั่นอาจหมายถึงคุณต้องการเรียกใช้คำสั่งในพื้นหลังโดยใส่คำสั่งไว้&
ท้ายสิ่งทั้งหมด:
nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out
บน Linux การรันงานด้วยnohup
การปิดอินพุตโดยอัตโนมัติเช่นกัน บนระบบอื่น ๆ สะดุดตา BSD และ macOS ซึ่งไม่ใช่กรณีดังนั้นเมื่อทำงานในพื้นหลังคุณอาจต้องการปิดอินพุตด้วยตนเอง แม้ว่าอินพุตปิดจะไม่มีผลต่อการสร้างหรือไม่nohup.out
ก็ตาม แต่จะช่วยหลีกเลี่ยงปัญหาอื่น: หากกระบวนการแบ็คกราวน์พยายามอ่านอะไรจากอินพุตมาตรฐานมันจะหยุดชั่วคราวรอให้คุณนำกลับมาที่พื้นหน้าและพิมพ์บางอย่าง ดังนั้นเวอร์ชันที่ปลอดภัยเป็นพิเศษจะมีลักษณะดังนี้:
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
อย่างไรก็ตามโปรดทราบว่าสิ่งนี้ไม่ได้ป้องกันคำสั่งจากการเข้าถึงเทอร์มินัลโดยตรงและไม่ได้ลบมันออกจากกลุ่มกระบวนการเชลล์ของคุณ หากคุณต้องการทำสิ่งหลังและคุณกำลังรัน bash, ksh หรือ zsh คุณสามารถทำได้โดยการรันdisown
โดยไม่มีอาร์กิวเมนต์เป็นคำสั่งถัดไป นั่นหมายความว่ากระบวนการพื้นหลังจะไม่เชื่อมโยงกับเชลล์ "งาน" อีกต่อไปและจะไม่มีสัญญาณใด ๆ ที่ส่งต่อไปยังเชลล์จากเชลล์ (สังเกตความแตกต่าง: disown
กระบวนการ ed จะไม่ส่งสัญญาณใด ๆ ไปยังมันโดยอัตโนมัติโดยพาเรนต์เชลล์ - แต่หากไม่มีnohup
ก็จะยังคงได้รับHUP
สัญญาณที่ส่งผ่านวิธีอื่นเช่นkill
คำสั่งด้วยตนเองnohup
กระบวนการ ed จะละเว้นHUP
สัญญาณใด ๆไม่ว่าพวกเขาจะถูกส่งอย่างไร)
คำอธิบาย:
ในระบบ Unixy แหล่งที่มาของอินพุตหรือเป้าหมายของเอาต์พุตมีตัวเลขที่เกี่ยวข้องกับมันเรียกว่า "file descriptor" หรือ "fd" ทุกโปรแกรมที่กำลังทำงานอยู่ ("กระบวนการ") มีชุดของตัวเองและเมื่อกระบวนการใหม่เริ่มขึ้นก็มีสามของพวกเขาเปิดแล้ว: "อินพุตมาตรฐาน" ซึ่งเป็น fd 0 เปิดให้กระบวนการอ่านจากในขณะที่ "เอาต์พุตมาตรฐาน" (fd 1) และ "ข้อผิดพลาดมาตรฐาน" (fd 2) เปิดขึ้นเพื่อให้เขียนได้ หากคุณเพียงแค่เรียกใช้คำสั่งในหน้าต่างเทอร์มินัลตามค่าเริ่มต้นสิ่งที่คุณพิมพ์จะไปที่อินพุตมาตรฐานในขณะที่ทั้งเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานจะถูกส่งไปที่หน้าต่างนั้น
แต่คุณสามารถขอให้เชลล์เปลี่ยนจุดบ่งไฟล์ใด ๆ หรือทั้งหมดก่อนที่จะเรียกใช้คำสั่ง นั่นคือสิ่งที่เปลี่ยนเส้นทาง ( <
, <<
, >
, >>
) และท่อ ( |
) ผู้ประกอบการทำ
ไปป์เป็นสิ่งที่ง่ายที่สุดของเหล่านี้ ... command1 | command2
จัดเรียงสำหรับเอาต์พุตมาตรฐานของcommand1
เพื่อป้อนลงในอินพุตมาตรฐานcommand2
โดยตรง นี่เป็นการจัดการที่สะดวกมากซึ่งนำไปสู่รูปแบบการออกแบบเฉพาะในเครื่องมือ UNIX (และอธิบายการมีอยู่ของข้อผิดพลาดมาตรฐานซึ่งช่วยให้โปรแกรมส่งข้อความไปยังผู้ใช้แม้ว่าเอาต์พุตจะเข้าสู่โปรแกรมถัดไปในไพพ์ไลน์) . แต่คุณสามารถไพพ์เอาต์พุตมาตรฐานไปยังอินพุตมาตรฐานเท่านั้น คุณไม่สามารถส่งไฟล์อธิบายไฟล์อื่น ๆ ไปยังไปป์โดยไม่มีการเล่นกล
โอเปอเรเตอร์การเปลี่ยนเส้นทางนั้นมีความเป็นมิตรมากกว่าซึ่งจะช่วยให้คุณระบุไฟล์ descriptor ที่จะเปลี่ยนทิศทาง ดังนั้น0<infile
อ่านเข้ามาตรฐานจากไฟล์ที่มีชื่อinfile
ในขณะที่ผนวกข้อผิดพลาดมาตรฐานที่ส่วนท้ายของไฟล์ที่มีชื่อ2>>logfile
logfile
หากคุณไม่ได้ระบุจำนวนดังนั้นค่าเริ่มต้นการเปลี่ยนเส้นทางอินพุตเป็น fd 0 ( <
เหมือนกับ0<
) ในขณะที่การเปลี่ยนเส้นทางออกเป็นค่าเริ่มต้นเป็น fd 1 ( >
เหมือนกับ1>
)
นอกจากนี้คุณสามารถรวมไฟล์ descriptors เข้าด้วยกัน: 2>&1
หมายถึง "ส่งข้อผิดพลาดมาตรฐานทุกที่ที่เอาต์พุตมาตรฐานกำลังดำเนินการ" นั่นหมายความว่าคุณจะได้รับเอาต์พุตสตรีมเดียวที่มีทั้งข้อผิดพลาดมาตรฐานและมาตรฐานที่ผสมกันโดยไม่มีวิธีแยกพวกเขาอีกต่อไป แต่ก็หมายความว่าคุณสามารถรวมข้อผิดพลาดมาตรฐานในไพพ์ได้
ดังนั้นลำดับจึง>/dev/null 2>&1
หมายถึง "ส่งเอาต์พุตมาตรฐานไปยัง/dev/null
" (ซึ่งเป็นอุปกรณ์พิเศษที่เพิ่งทิ้งสิ่งที่คุณเขียนไป) "จากนั้นส่งข้อผิดพลาดมาตรฐานไปยังที่ใดก็ตามที่เอาต์พุตมาตรฐานกำลังดำเนินการ" (ซึ่งเราเพิ่งแน่ใจว่าเป็น/dev/null
) โดยพื้นฐานแล้ว "ทิ้งคำสั่งใดก็ตามที่เขียนไปยัง file descriptor"
เมื่อnohup
ตรวจพบว่าไม่มีข้อผิดพลาดมาตรฐานหรือเอาท์พุทเชื่อมต่อกับเทอร์มินัลก็ไม่ได้กังวลที่จะสร้างnohup.out
แต่สมมติว่าเอาท์พุทจะถูกเปลี่ยนเส้นทางแล้วที่ผู้ใช้ต้องการไป
/dev/null
อุปกรณ์ทำงานสำหรับการป้อนข้อมูลมากเกินไป; หากคุณเรียกใช้คำสั่งด้วย</dev/null
ความพยายามใด ๆ ที่คำสั่งให้อ่านจากอินพุตมาตรฐานจะพบจุดสิ้นสุดไฟล์ทันที โปรดทราบว่าไวยากรณ์การผสานจะไม่มีผลเหมือนกันที่นี่ มันจะทำงานเพื่อชี้ไฟล์ descriptor ไปยังอีกอันที่เปิดในทิศทางเดียวกัน (อินพุตหรือเอาต์พุต) เชลล์จะยอมให้คุณทำ>/dev/null <&1
แต่สิ่งนี้จะสร้างกระบวนการด้วยตัวอธิบายไฟล์อินพุตที่เปิดบนเอาต์พุตสตรีมดังนั้นแทนที่จะเพียงแค่กดจุดสิ้นสุดของไฟล์ความพยายามในการอ่านใด ๆ จะทำให้เกิดข้อผิดพลาด
nohup
"ถ้ากระบวนการในภายหลังพยายามอ่านอะไรจากอินพุตมาตรฐานมันจะหยุดชั่วคราวรอให้คุณนำกลับไปที่พื้นหน้าและพิมพ์บางอย่าง" ดูเหมือนว่าไม่ถูกต้อง ให้nohup
ปิดอินพุตมาตรฐาน (โปรแกรมจะไม่สามารถอ่านอินพุตใด ๆ ได้แม้ว่าจะถูกรันในพื้นหน้า แต่ไม่ได้หยุดทำงาน แต่จะได้รับรหัสข้อผิดพลาดหรือ EOF)
nohup
ไม่ได้ปิดอินพุตมาตรฐานโดยอัตโนมัติ โปรดทราบว่าnohup
ไม่ใช่เชลล์ในตัว แต่เป็นยูทิลิตี้ไบนารี
nohup
นั้นแตกต่างกันสำหรับ linux และสำหรับ BSD หรือ OS X หรือไม่?
awk
มีความแตกต่างsed
มีความแตกต่างแตกต่างnohup
กัน ...
nohup some_command > /dev/null 2>&1&
นั่นคือทั้งหมดที่คุณต้องทำ!
&
ที่จะทำให้คุณไม่จำเป็นต้องใช้ctrl-c
หากมีความสำคัญกับคุณ
some_command
เอาท์พุทรวมถึงข้อผิดพลาด
คุณลองเปลี่ยนเส้นทางสตรีม I / O ทั้งสาม:
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
>
/ dev / null แทนที่จะเป็น </ dev / null?
< /dev/null
nohup
Linux ไม่ต้องการสิ่งนี้ แต่ POSIX อนุญาตให้มีพฤติกรรมที่nohup
ไม่สามารถทำงานบนพื้นหลังหากอินพุตมาตรฐานเชื่อมต่อกับเทอร์มินัล ตัวอย่างของระบบดังกล่าวคือ BSD และ OS X.
คุณอาจต้องการที่จะใช้โปรแกรม detach คุณใช้มันชอบnohup
แต่มันไม่ได้สร้างบันทึกเอาท์พุทเว้นแต่คุณจะบอกให้ นี่คือหน้าคน:
NAME
detach - run a command after detaching from the terminal
SYNOPSIS
detach [options] [--] command [args]
Forks a new process, detaches is from the terminal, and executes com‐
mand with the specified arguments.
OPTIONS
detach recognizes a couple of options, which are discussed below. The
special option -- is used to signal that the rest of the arguments are
the command and args to be passed to it.
-e file
Connect file to the standard error of the command.
-f Run in the foreground (do not fork).
-i file
Connect file to the standard input of the command.
-o file
Connect file to the standard output of the command.
-p file
Write the pid of the detached process to file.
EXAMPLE
detach xterm
Start an xterm that will not be closed when the current shell exits.
AUTHOR
detach was written by Robbert Haarman. See http://inglorion.net/ for
contact information.
หมายเหตุฉันไม่มีส่วนเกี่ยวข้องกับผู้เขียนโปรแกรม ฉันเป็นเพียงผู้ใช้ที่พึงพอใจของโปรแกรม
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null" &
การเปลี่ยนเส้นทางเอาต์พุตของ sudo ทำให้ sudo ทำการ reask สำหรับรหัสผ่านดังนั้นจำเป็นต้องใช้กลไกที่น่าอึดอัดใจในการทำตัวแปรนี้
หากคุณมี BASH เชลล์บน mac / linux ของคุณต่อหน้าคุณลองทำตามขั้นตอนด้านล่างเพื่อทำความเข้าใจเกี่ยวกับการเปลี่ยนเส้นทางในทางปฏิบัติ:
สร้างสคริปต์ 2 บรรทัดชื่อ zz.sh
#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
ขณะนี้เพียงแค่เรียกใช้งานสคริปต์ส่งทั้ง STDOUT และ STDERR ไปที่หน้าจอ
./zz.sh
ตอนนี้เริ่มต้นด้วยการเปลี่ยนเส้นทางมาตรฐาน:
zz.sh > zfile.txt
ในข้างต้น "echo" (STDOUT) ไปที่ zfile.txt โดยที่ "error" (STDERR) แสดงขึ้นมาบนหน้าจอ
ด้านบนเป็นเช่นเดียวกับ:
zz.sh 1> zfile.txt
ตอนนี้คุณสามารถลองตรงข้ามและเปลี่ยนเส้นทาง "ข้อผิดพลาด" STDERR ไปยังไฟล์ คำสั่ง STDOUT จาก "echo" ไปที่หน้าจอ
zz.sh 2> zfile.txt
เมื่อรวมสองข้อข้างต้นเข้าด้วยกัน:
zz.sh 1> zfile.txt 2>&1
คำอธิบาย:
ในที่สุดคุณสามารถจัดเก็บสิ่งทั้งหมดไว้ใน คำสั่ง nohup &เพื่อรันในพื้นหลัง:
nohup zz.sh 1> zfile.txt 2>&1&
คุณสามารถเรียกใช้คำสั่งด้านล่าง
nohup <your command> & > <outputfile> 2>&1 &
เช่นฉันมีคำสั่ง nohup ภายในสคริปต์
./Runjob.sh > sparkConcuurent.out 2>&1