ฉันจะแยกกระบวนการออกจากเทอร์มินัลได้อย่างไร


304

ฉันใช้ Tilda (เทอร์มินัลแบบหล่นลง) บน Ubuntu เป็น "ศูนย์กลางคำสั่ง" ของฉัน - เป็นวิธีที่คนอื่น ๆ อาจใช้ GNOME Do, Quicksilver หรือ Launchy

อย่างไรก็ตามฉันกำลังดิ้นรนกับวิธีแยกกระบวนการ (เช่น Firefox) ออกจากเทอร์มินัลอย่างสมบูรณ์ซึ่งเปิดตัวจาก - นั่นคือป้องกันกระบวนการลูก (ไม่ใช่ -) ดังกล่าว

  • ถูกยกเลิกเมื่อปิดเทอร์มินัลต้นทาง
  • "ก่อให้เกิดมลพิษ" ขั้วต้นทางผ่าน STDOUT / STDERR

ตัวอย่างเช่นในการเริ่ม Vim ในหน้าต่างเทอร์มินัล "เหมาะสม" ฉันได้ลองใช้สคริปต์อย่างง่ายดังต่อไปนี้:

exec gnome-terminal -e "vim $@" &> /dev/null &

อย่างไรก็ตามยังคงทำให้เกิดมลภาวะ (เช่นกันการส่งชื่อไฟล์ไม่สามารถใช้งานได้)


1
นั่นก็เป็นคำถามที่ดีเช่นกัน ฉันคิดว่ามันยุติธรรมที่จะพิจารณาทุบตีภาษาการเขียนโปรแกรม - แม้ว่าแน่นอนขอบเขตของคำถามนี้อาจจะมากขึ้นในด้านดูแลระบบ ...

นี่เป็นคำถามซ้ำซ้อนของคำถามนี้stackoverflow.com/questions/285015/…
Dana the Sane


กรณีการใช้งานของคุณไม่ได้อธิบายถึงการปลดที่สมบูรณ์แบบ
jiggunjer

คำตอบ:


344

ก่อนอื่น; เมื่อคุณเริ่มกระบวนการคุณสามารถแบ็คกราวน์ได้โดยหยุดขั้นตอนแรก (กดCtrl- Z) จากนั้นพิมพ์bgเพื่อให้กระบวนการทำงานต่อในพื้นหลัง ตอนนี้เป็น "งาน" และstdout/ stderr/ stdinยังคงเชื่อมต่อกับเทอร์มินัลของคุณ

คุณสามารถเริ่มต้นกระบวนการเป็นพื้นหลังได้ทันทีโดยเพิ่ม "&" ต่อท้าย:

firefox &

หากต้องการเรียกใช้ในโหมดปิดเสียงเบื้องหลังให้ใช้สิ่งนี้:

firefox </dev/null &>/dev/null &

ข้อมูลเพิ่มเติมบางส่วน:

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

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

สิ่งที่คุณไม่สามารถทำได้คือเปลี่ยน stdout / stderr / stdin ของกระบวนการหลังจากเปิดใช้งานแล้ว อย่างน้อยไม่ได้มาจากเปลือก หากคุณเริ่มต้นกระบวนการของคุณและบอกว่า stdout นั้นเป็นเทอร์มินัลของคุณ (ซึ่งเป็นสิ่งที่คุณทำตามค่าเริ่มต้น) กระบวนการนั้นจะถูกกำหนดค่าให้ส่งออกไปยังเทอร์มินัลของคุณ เชลล์ของคุณไม่มีธุรกิจที่มีการตั้งค่า FD ของกระบวนการนั่นเป็นสิ่งที่กระบวนการจัดการเอง กระบวนการสามารถตัดสินใจได้ว่าจะปิด stdout / stderr / stdin หรือไม่ แต่คุณไม่สามารถใช้เชลล์เพื่อบังคับให้ทำเช่นนั้นได้

ในการจัดการผลลัพธ์ของกระบวนการพื้นหลังคุณมีตัวเลือกมากมายจากสคริปต์ "nohup" อาจเป็นคนแรกที่นึกถึง แต่สำหรับกระบวนการโต้ตอบที่คุณเริ่มต้น แต่ลืมที่จะเงียบ ( firefox < /dev/null &>/dev/null &) คุณไม่สามารถทำอะไรได้มากจริงๆ

ผมขอแนะนำให้คุณได้รับ screenGNU ด้วยหน้าจอคุณก็สามารถปิดการทำงานของคุณเปลือกเมื่อผลผลิตกระบวนการกลายเป็นรำคาญและเปิดใหม่ ( ^Ac)


โอ้และอย่าใช้ " $@" ในที่ที่คุณใช้อยู่

$@หมายความว่า$1, $2, $3... ซึ่งจะเปิดคำสั่งของคุณเป็น:

gnome-terminal -e "vim $1" "$2" "$3" ...

นั่นอาจไม่ใช่สิ่งที่คุณต้องการเพราะ -e รับเพียงหนึ่งอาร์กิวเมนต์เท่านั้น ใช้$1เพื่อแสดงว่าสคริปต์ของคุณสามารถจัดการกับอาร์กิวเมนต์ได้เพียงหนึ่งข้อเท่านั้น

เป็นการยากที่จะให้อาร์กิวเมนต์หลายตัวทำงานอย่างถูกต้องในสถานการณ์ที่คุณให้ (กับgnome-terminal -e) เพราะ-eใช้อาร์กิวเมนต์เพียงตัวเดียวเท่านั้นซึ่งเป็นสตริงคำสั่งเชลล์ คุณต้องเข้ารหัสข้อโต้แย้งของคุณเป็นหนึ่ง วิธีที่ดีที่สุดและแข็งแกร่งที่สุด แต่ค่อนข้างมีลักษณะเป็น cludgy:

gnome-terminal -e "vim $(printf "%q " "$@")"

ขอบคุณมากสำหรับสิ่งนี้! น่าเศร้าที่ฉันยอมรับได้เพียงคำตอบเดียวเท่านั้น ฉันสิ้นสุดด้วย "nohup $ @ &> / dev / null &" และ "alias wvim = 'launch.sh gnome-terminal -x vim'"

20
ช่างเป็นคำตอบที่มีรายละเอียดและข้อมูลที่น่าอัศจรรย์ใจ +1
Teekin

1
@ Hi-Angel เมื่อคุณปิดเชลล์ bash แบบโต้ตอบทุบตี HUPs งานที่กำลังทำอยู่ทั้งหมด เมื่อคุณ ^ Z และ bg กระบวนการมันยังคงเป็นงานไม่ว่าจะเป็นพื้นหลัง หากต้องการลบมันออกเป็นงานให้ใช้disownจากนั้นกระบวนการจะยังคงอยู่หลังจากที่คุณปิดเชลล์เนื่องจากทุบตีจะไม่ HUP อีกต่อไป
lhunath

3
จะไม่ใช้$*แทนที่จะ$@แก้ไขปัญหาของสตริงที่แยกกันแล้วหรือไม่
sjas

2
สิ่งที่คุณไม่สามารถทำได้คือเปลี่ยน stdout / stderr / stdin ของกระบวนการหลังจากเปิดใช้งานแล้ว - ไม่เป็นความจริงอย่างแน่นอน ใช้reptyrสำหรับสิ่งนี้
Stefan Seidel

198
nohup cmd &

nohup แยกกระบวนการอย่างสมบูรณ์ (daemonizes มัน)


5
แม้ว่ารวบรัดมีค่า แต่ความสมบูรณ์มีค่ามากกว่า แม้ว่า nohup เป็น coreutil ของ GNU แต่คำตอบอย่างเดียว (หรือหมายเหตุเกี่ยวกับการไม่มีอยู่) จะเหมาะสมที่นี่ คำตอบที่ดีอย่างไรก็ตาม
การชดเชย จำกัด

23
nohupเพียงแค่ละเว้นSIGHUPสัญญาณ มันรันกระบวนการตามปกติ ไม่มีการ daemonization
nemo

1
@nemo ซึ่งหมายความว่ากระบวนการไม่ได้ถูกแยกออก แต่จะแยกออก (และลูกของinit) ถ้าเชลล์ออก ... ใช่มั้ย
Noldorin

@Noldorin ใช่ การเพิกเฉยต่อ SIGHUP ซึ่งถูกส่งเมื่อเชลล์ยกเลิกจะทำให้กระบวนการลูกทำงานและจะถูกย้ายไปเริ่มต้น
nemo

@nemo nohup ยังเงียบมาตรฐานใน / ลึกหนาบาง ติดตามด้วยการปฏิเสธเพื่อแยกออกอย่างสมบูรณ์
jiggunjer

60

หากคุณใช้งานอยู่bashให้ลอง; ดูทุบตี (1)disown [jobspec]

at nowวิธีการที่คุณสามารถลองอีกประการหนึ่งคือ หากคุณไม่ใช่ผู้ใช้ระดับสูงการอนุญาตให้ใช้ของคุณatอาจถูก จำกัด


"ปฏิเสธ" ดูเหมือนจะไม่ใช่คำสั่ง bash ภายใน (ไม่มีในเครื่องของฉันและฉันใช้ bash) "nohup" ตามที่เบ็นแนะนำอาจเป็นวิธีที่ดีกว่า (และมาตรฐาน) ในการทำสิ่งนี้

1
ไม่เคยคิดว่าจะใช้ "at" ขอบคุณสำหรับความคิด!
cadrian

1
atเพื่อมอบหมายการดำเนินการกับคนอื่นฉันชอบมัน! +1
Ninsuo

1
ในฐานะที่เป็นจุดอ้างอิงสิ่งนี้ก็ใช้ได้zshเช่นกัน
Coderer

1
นอกจากนี้disownดูเหมือนว่าจะไม่ได้ผลตามที่ต้องการด้วยgnome-terminal- disownกระบวนการ ed ยังคงถูกฆ่าเมื่อออกจากสถานี ฉันชอบที่จะรู้ว่าทำไม / อย่างไร
Kyle Strand

38

อ่านคำตอบเหล่านี้ฉันอยู่ภายใต้การแสดงผลครั้งแรกว่าการออกnohup <command> &จะเพียงพอ ใช้ zsh ใน gnome-terminal ฉันพบnohup <command> &ว่าไม่ได้ป้องกันเปลือกของฉันจากการฆ่ากระบวนการลูกเมื่อออก แม้ว่าnohupจะมีประโยชน์โดยเฉพาะอย่างยิ่งกับเชลล์ที่ไม่มีการโต้ตอบเชลล์จะรับประกันเฉพาะพฤติกรรมนี้หากกระบวนการลูกไม่รีเซ็ตตัวจัดการสำหรับSIGHUPสัญญาณ

ในกรณีของฉันnohupควรป้องกันสัญญาณ Hangup ไม่ให้เข้าถึงแอปพลิเคชัน แต่แอปพลิเคชันลูก (VMWare Player ในกรณีนี้) กำลังรีเซ็ตSIGHUPตัวจัดการ เป็นผลให้เมื่อเทอร์มินัลอีมูเลเตอร์ออกไปมันยังสามารถฆ่าโพรเซสย่อยของคุณได้ ความรู้ของฉันสามารถแก้ไขได้โดยการทำให้แน่ใจว่ากระบวนการนั้นถูกลบออกจากตารางงานของเชลล์ หากnohupถูกแทนที่ด้วยเชลล์บิวด์อินบางครั้งก็เป็นกรณีนี้อาจจะเพียงพออย่างไรก็ตามในกรณีที่มันไม่ได้ ...


disownเป็นเปลือก builtin ในbash, zshและksh93,

<command> &
disown

หรือ

<command> &; disown

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

หลังจากการปฏิเสธกระบวนการยังคงเป็นลูกของเทอร์มินัลอีมูเลเตอร์ของคุณ (เล่นด้วยpstreeถ้าคุณต้องการดูสิ่งนี้ในการทำงาน) แต่หลังจากเทอร์มินัลอีมูเลเตอร์จบการทำงานคุณควรเห็นมันติดอยู่กับกระบวนการ init กล่าวอีกนัยหนึ่งทุกอย่างเป็นไปตามที่ควรและตามที่คุณต้องการให้เป็น

จะทำอย่างไรถ้าเปลือกของคุณไม่สนับสนุนdisown? ฉันขอแนะนำให้เปลี่ยนไปใช้สิ่งที่ทำ แต่ในกรณีที่ไม่มีตัวเลือกนั้นคุณมีทางเลือกน้อย

  1. screenและtmuxสามารถแก้ปัญหานี้ได้ แต่พวกมันเป็นวิธีแก้ปัญหาน้ำหนักที่หนักกว่ามากและฉันไม่ชอบที่จะเรียกใช้งานเหล่านี้สำหรับงานง่ายๆ พวกมันเหมาะสมกว่าสำหรับสถานการณ์ที่คุณต้องการบำรุงรักษา tty ซึ่งโดยทั่วไปแล้วบนเครื่องระยะไกล
  2. สำหรับผู้ใช้หลายคนอาจต้องการดูว่าเชลล์ของคุณรองรับความสามารถเช่น zsh setopt nohupหรือไม่ สามารถใช้เพื่อระบุว่าSIGHUPไม่ควรส่งงานในตารางงานเมื่อเชลล์ออก คุณสามารถใช้สิ่งนี้ก่อนที่จะออกจากเปลือกหรือเพิ่มลงในการกำหนดค่าเปลือกเช่น~/.zshrcถ้าคุณต้องการมันเสมอ
  3. ค้นหาวิธีแก้ไขตารางงาน ฉันไม่สามารถหาวิธีที่จะทำสิ่งนี้ในtcshหรือcshซึ่งค่อนข้างรบกวน
  4. เขียนโปรแกรม C exec()ขนาดเล็กที่จะแยกออกและ นี่เป็นวิธีการแก้ปัญหาที่แย่มาก แต่ที่มาควรมีเพียงสองสามบรรทัด จากนั้นคุณสามารถส่งคำสั่งเป็นอาร์กิวเมนต์บรรทัดคำสั่งไปยังโปรแกรม C และหลีกเลี่ยงรายการเฉพาะกระบวนการในตารางงาน

29
  1. nohup $COMMAND &
  2. $COMMAND & disown
  3. setsid command

ฉันใช้หมายเลข 2 มานานมากแล้ว แต่หมายเลข 3 ก็ใช้ได้เช่นกัน นอกจากนี้ยังdisownมีnohupธงชาติ-hสามารถปฏิเสธกระบวนการทั้งหมดที่มีและสามารถปฏิเสธกระบวนการทำงานทั้งหมดที่มี -a-ar

$COMMAND &>/dev/nullสมรสามารถทำได้โดย

หวังว่านี่จะช่วยได้!


สั้นและหวาน ขอบคุณสำหรับการสรุปที่เป็นประโยชน์มาก!
Sheljohn

ฉันไม่อยากจะเชื่อว่าฉันยังคงได้รับการแจ้งเตือนสำหรับโพสต์นี้ ...
นายมิ้นต์เฟรช

9

ฉันคิดว่าหน้าจออาจแก้ปัญหาของคุณ


9

ใน tcsh (และอาจเป็นในเชลล์อื่นด้วย) คุณสามารถใช้วงเล็บเพื่อแยกกระบวนการ

เปรียบเทียบสิ่งนี้:

> jobs # shows nothing
> firefox &
> jobs
[1]  + Running                       firefox

สำหรับสิ่งนี้:

> jobs # shows nothing
> (firefox &)
> jobs # still shows nothing
>

สิ่งนี้จะลบ firefox ออกจากรายการงาน แต่มันยังคงเชื่อมโยงกับเทอร์มินัล หากคุณล็อกอินเข้าสู่โหนดนี้ผ่าน 'ssh' การพยายามออกจากระบบจะยังคงดำเนินการกับกระบวนการ ssh


9

คำตอบที่ง่ายและถูกต้องที่สุดสำหรับการทุบตีเท่านั้น:

command & disown

คุณไม่ต้องแยกกระบวนการออกจากเทอร์มินัล แต่จากเชลล์


7

เพื่อยกเลิกการเชื่อมโยงคำสั่ง tty shell run ผ่าน sub-shell สำหรับเช่น

(คำสั่ง) และ

เมื่อออกจากสถานีที่ใช้ปิด แต่กระบวนการยังมีชีวิตอยู่

ตรวจสอบ -

(sleep 100) & exit

เปิดเทอร์มินัลอื่น

ps aux | grep sleep

กระบวนการยังมีชีวิตอยู่


นี่คือสิ่งที่ฉันต้องการ ฉันพยายามเพิ่มทางลัดคอนโซลสำหรับข้อความประเสริฐและทำงานได้อย่างสมบูรณ์นี่คือสิ่งที่ฉันได้รับ: ("/ opt / Sublime Text 2 / sublime_text" $ @) &
Ron E

5

ความเป็นมาและการทำงานเบื้องหน้าเป็นหนึ่งในสิ่งแรก ๆ ที่ผู้ดูแลระบบ Unix ควรรู้

นี่คือวิธีการทำ bash:

./script.sh
# suspend process
{ctrl-Z}
# background process
bg
# list all backgrounded jobs
jobs
# bring it back to foreground
fg

4

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


ฉันสาบานได้ว่าฉันได้ลอง nohup ก่อนใช้ exec - แต่ดูเหมือนจะไม่ถูกต้องเพราะมันทำงานเช่นนี้: nohup gnome-terminal -e "vim $ @" &> / dev / null &

2

ลองใช้daemon - ควรมีให้จากผู้จัดการแพ็คเกจที่เป็นมิตรและดูแลทุกวิธีในการแยกการเชื่อมโยงตัวเองออกจากเครื่อง


2

เพียงเพิ่มสิ่งนี้ลงใน bashrc / zshrc ของคุณ:

detach() {
  "$@" 1>/dev/null 2>/dev/null &; disown
}

จากนั้นคุณสามารถเรียกใช้คำสั่งที่ถูกปฏิเสธเช่นนี้:

detach gedit ~/.zshrc

1

ใน. bashrc ของฉันฉันมีฟังก์ชันเหล่านี้เพื่อจุดประสงค์นั้นอย่างแม่นยำ:

function run_disowned() {
    "$@" & disown
}

function dos() {
    # run_disowned and silenced

    run_disowned "$@" 1>/dev/null 2>/dev/null
}

คำนำหน้าคำสั่งด้วยdosเพื่อเรียกใช้มันออกมาจาก terminal

ฟังก์ชั่นที่เขียนจะทำงานร่วมกับและbashzsh


1
( "$@" & disown) &> /dev/nullฉันกำลังสับสนเล็กน้อยว่าทำไมคำตอบนี้จะใช้ฟังก์ชั่นหนึ่งห่อเข้าไปอีกเมื่อมันเพียงพอที่จะใช้เพียงหนึ่งฟังก์ชั่นกับร่างกายเช่นนี้ นอกจากนี้ยังไม่สมเหตุสมผลในการใช้1>และ2>เนื่องจากคุณใช้disownซึ่งหมายความว่าคุณกำลังใช้ bash และใน bash คุณสามารถทำการ&>เปลี่ยนเส้นทางทั้ง stdout และ stderr ได้อย่างง่ายดาย
Sergiy Kolodyazhnyy

ฉันมีทั้งสองฟังก์ชั่นเพราะ (1) ฉันคิดว่ามันอ่านง่ายกว่าและ (2) ฉันต้องการrun_disownedฟังก์ชั่นการใช้งานในที่อื่น ๆ ใน dotfiles ของฉัน คุณถูกต้องเกี่ยวกับ&>สิ่งที่แน่นอน
mic_e

0

ฉันพบใน Mac OS X ที่ฉันต้องใช้ทั้ง nohup และ disown เพื่อให้แน่ใจว่ากระบวนการลูกไม่ได้ถูกดึงลงด้วยเทอร์มินัล


0

ฉันใช้สคริปต์ต่อไปนี้เพื่อทำสิ่งนี้ จะหยุดกระบวนการพิมพ์ไปยังสถานีที่แยกกับและออกจากที่มีสถานะกลับมาหากเสร็จสิ้นคำสั่งภายในnohupTIMEOUT

#!/bin/bash

TIMEOUT=0.1

CMD=( "$@" )
#Could have some shortcuts here, e.g. replace "somefile.c" with "gedit somefile.c"

#use nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send nohup's output to /dev/null, supressing nohup.out
#run nohup in the background so this script doesn't block
#print the command for debugging and to see bash variable expansion
printf "%q " "${CMD[@]}"
echo
nohup "${CMD[@]}" >/dev/null 2>&1 &
NOHUP_PID=$!

#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally

#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $NOHUP_PID
NOHUP_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $NOHUP_STATUS != 0 ] && echo "Error: $CMD"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS

ตัวอย่างการใช้งาน:

>>> run false
false
Error: false
>>> echo $?
1
>>> run true
true
>>> run sleep 10
sleep 10
>>>


-1

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

การติดตั้งPM2คุณจะต้องดาวน์โหลดNPM สำหรับระบบที่ใช้ Debian

sudo apt-get install npm

และสำหรับ Redhat

sudo yum install npm

หรือคุณสามารถปฏิบัติตามคำแนะนำเหล่านี้ หลังจากติดตั้งnpm แล้วให้ใช้เพื่อติดตั้งpm2

npm install pm2@latest -g

เมื่อเสร็จแล้วคุณสามารถเริ่มต้นแอปพลิเคชันของคุณได้

$ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
$ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)

สำหรับการตรวจสอบกระบวนการใช้คำสั่งต่อไปนี้:

$ pm2 list                      # List all processes started with PM2
$ pm2 monit                     # Display memory and cpu usage of each app
$ pm2 show [app-name]           # Show all informations about application

จัดการกระบวนการโดยใช้ชื่อแอพหรือรหัสกระบวนการหรือจัดการกระบวนการทั้งหมดเข้าด้วยกัน:

$ pm2 stop     <app_name|id|'all'|json_conf>
$ pm2 restart  <app_name|id|'all'|json_conf>
$ pm2 delete   <app_name|id|'all'|json_conf>

สามารถดูไฟล์บันทึกได้

$HOME/.pm2/logs #contain all applications logs

1
การใช้แอปพลิเคชั่น NodeJS (เทียบกับคำสั่งขนาดเล็กและทนทานเช่น nohup) เพื่อควบคุมกระบวนการยูนิกซ์ดูเหมือนว่า ... overkill จริง ๆ และจะซื่อสัตย์ค่อนข้างแปลก ฉันจะใช้ monit ถ้าคุณต้องการฟังก์ชั่นการรีสตาร์ท
Sergio

@Sergio เป็นทางเลือกของคุณในการใช้แอพพลิเคชั่น
haccks

มีการเผยแพร่หลายครั้งในปีนี้ (หนึ่งวันที่แล้ว 4 วัน) ดังนั้นฉันไม่เห็นว่า / ทำไมคุณอาจคิดว่า monit เป็นแอปพลิเคชันที่เลิกใช้แล้ว @see mmonit.com/monit/changes
Sergio

ฉันกำลังพูดถึง nohup
haccks

1
nohupเป็นคำสั่ง POSIX มาตรฐานธรรมดาข้อสังเกตเดียวกันดังนั้น: ไม่มีวิธีที่ถูกคัดค้าน @see unix.com/man-page/posix/1p/nohup
Sergio

-1

หากเป้าหมายของคุณคือการเปิดใช้แอปพลิเคชันบรรทัดคำสั่งโดยไม่ต้องปิดหน้าต่างเทอร์มินัลโดยรอบคุณอาจลองเรียกใช้แอปพลิเคชันหลังจากเปิดใช้งานเทอร์มินัลด้วย alt-F2

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