วิธีป้องกันกระบวนการพื้นหลังไม่ให้หยุดทำงานหลังจากปิดไคลเอ็นต์ SSH ใน Linux


291

ฉันกำลังทำงานกับเครื่อง Linux ผ่าน SSH (Putty) ฉันต้องออกจากกระบวนการที่ทำงานในตอนกลางคืนดังนั้นฉันคิดว่าฉันสามารถทำได้โดยเริ่มกระบวนการในพื้นหลัง (ด้วยเครื่องหมายแอมเปอร์แซนด์ท้ายคำสั่ง) และเปลี่ยนเส้นทาง stdout ไปยังไฟล์

แปลกใจของฉันที่ไม่ทำงาน ทันทีที่ฉันปิดหน้าต่าง Putty กระบวนการจะหยุดลง

ฉันจะป้องกันไม่ให้สิ่งนั้นเกิดขึ้นได้อย่างไร?

คำตอบ:


301

ลองดูโปรแกรม " nohup "


4
คุณจะหยุดมันได้อย่างไรในภายหลัง?
Derek Dahmer

9
เข้าสู่ระบบและทำ "kill <pid>" ใช้ "pidof" หากคุณไม่รู้จัก pid
JesperE

32
คุณสามารถใช้nohup command > /dev/null 2>&1 &เพื่อทำงานในพื้นหลังโดยไม่ต้องสร้างเอาต์พุต stdout หรือ stderr ใด ๆ (ไม่มีnohup.outไฟล์)
KCD

จะทำอย่างไรถ้าฉันต้องการป้อนข้อมูลบางอย่าง ตัวอย่างเช่นฉันมีสคริปต์ยาวที่ต้องทำงานในพื้นหลัง แต่ก่อนถามรหัสผ่าน FTP ของฉัน nohupไม่ได้ช่วยในกรณีนี้ มีวิธีที่จะซอกับCtrl+Z/ bg?
Sergey

1
เนื่องจากฉันขี้เกียจและไม่ดีในการจดจำลำดับความลับของตัวละครฉันจึงเขียนสิ่งนี้ตามสิ่งที่ @ KCD พูดและใช้มันบ่อยครั้งมาก
ความผิดปกติ

167

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


7
นี่เป็นหนึ่งในซอฟต์แวร์ที่ยิ่งใหญ่ที่สุดที่ฉันเคยใช้ อย่างจริงจัง. ฉันใช้กล่อง BSD ที่ส่งมาจากทุกที่และสามารถแนบหน้าจอของฉันอีกครั้งและมีเทอร์มินัลทั้งหมดที่ฉันกำลังทำสิ่งต่าง ๆ
Adam Jaskiewicz

1
ฉันสามารถยืนยันกับคนนี้ หน้าจอเป็นแอปที่ยอดเยี่ยม ความสามารถในการแนบไฟล์อีกครั้งนั้นน่าทึ่งและช่วยประหยัดงานที่อาจสูญหายได้มากมาย
willasaywhat

ฉันยังใช้กับเครื่องท้องถิ่นและแนบ xterms หลายตัวเข้ากับเซสชันหน้าจอเดียวกัน (screen -x) ด้วยวิธีนี้ฉันสามารถเปิดหน้าต่างจำนวนมากภายในเซสชันหน้าจอของฉันและเปลี่ยน xterms ต่าง ๆ จากหน้าต่างหนึ่งเป็นหน้าต่างได้อย่างอิสระ
Adam Jaskiewicz

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

1
+1 สำหรับหน้าจอ หรือเป็นทางเลือก tmux (ฉันชอบอันนี้มากกว่าหน้าจอ) หรือแม้กระทั่ง byobu ซึ่งเป็นส่วนหน้าจอที่ดีสำหรับหน้าจอหรือ tmux คุณสามารถพิมพ์หน้าจอเพื่อให้เชลล์ใช้งานและกลับมาในภายหลังได้ตลอดเวลาหรือเรียกใช้คำสั่งของคุณด้วยหน้าจอเช่น "คำสั่งหน้าจอ": เซสชันหน้าจอจะมีอยู่ตราบใดที่กระบวนการ "คำสั่ง" มีอยู่ นานมากคุณสามารถย้อนกลับและดูเอาต์พุตมาตรฐานได้ตลอดเวลา
gerlos

81

เมื่อเซสชั่นถูกปิดกระบวนการจะรับสัญญาณ SIGHUP ซึ่งดูเหมือนจะไม่จับ คุณสามารถใช้nohupคำสั่งเมื่อเรียกใช้งานกระบวนการหรือคำสั่งในตัวของ bash disown -hหลังจากเริ่มต้นกระบวนการเพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้น:

> help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

4
ข้อได้เปรียบที่นี่คือการไม่ทำงานสำหรับกระบวนการที่ได้เริ่มขึ้นแล้ว
Christian K.

1
'jobspec' หมายถึง pid หรือไม่
สจ๊วต

1
ไม่ต้องกังวลพบคำตอบนี้ที่นี่stackoverflow.com/questions/625409/…
Stewart

42

daemonize? nohup? หน้าจอ? (tmux ftw หน้าจอเป็นขยะ ;-)

ทำในสิ่งที่แอพอื่น ๆ ทำมาตั้งแต่ต้น - แยกสองครั้ง

# ((exec sleep 30)&)
# grep PPid /proc/`pgrep sleep`/status
PPid:   1
# jobs
# disown
bash: disown: current: no such job

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

สร้างเป็น coproc.sh:

#!/bin/bash

IFS=

run_in_coproc () {
    echo "coproc[$1] -> main"
    read -r; echo $REPLY
}

# dynamic-coprocess-generator. nice.
_coproc () {
    local i o e n=${1//[^A-Za-z0-9_]}; shift
    exec {i}<> <(:) {o}<> >(:) {e}<> >(:)
. /dev/stdin <<COPROC "${@}"
    (("\$@")&) <&$i >&$o 2>&$e
    $n=( $o $i $e )
COPROC
}

# pi-rads-of-awesome?
for x in {0..5}; do
    _coproc COPROC$x run_in_coproc $x
    declare -p COPROC$x
done

for x in COPROC{0..5}; do
. /dev/stdin <<RUN
    read -r -u \${$x[0]}; echo \$REPLY
    echo "$x <- main" >&\${$x[1]}
    read -r -u \${$x[0]}; echo \$REPLY
RUN
done

แล้ว

# ./coproc.sh 
declare -a COPROC0='([0]="21" [1]="16" [2]="23")'
declare -a COPROC1='([0]="24" [1]="19" [2]="26")'
declare -a COPROC2='([0]="27" [1]="22" [2]="29")'
declare -a COPROC3='([0]="30" [1]="25" [2]="32")'
declare -a COPROC4='([0]="33" [1]="28" [2]="35")'
declare -a COPROC5='([0]="36" [1]="31" [2]="38")'
coproc[0] -> main
COPROC0 <- main
coproc[1] -> main
COPROC1 <- main
coproc[2] -> main
COPROC2 <- main
coproc[3] -> main
COPROC3 <- main
coproc[4] -> main
COPROC4 <- main
coproc[5] -> main
COPROC5 <- main

และคุณไปวางไข่อะไรก็ตาม <(:) เปิดไปป์ที่ไม่ระบุชื่อผ่านการทดแทนกระบวนการซึ่งจะตาย แต่ไปป์ก็วนไปมาเพราะคุณมีจุดจับ ฉันมักจะทำsleep 1แทน:เพราะมีชีวิตชีวาเล็กน้อยและฉันจะได้รับข้อผิดพลาด "ไฟล์ไม่ว่าง" - จะไม่เกิดขึ้นหากคำสั่งจริงถูกรัน (เช่นcommand true)

"heredoc sourcing":

. /dev/stdin <<EOF
[...]
EOF

สิ่งนี้ใช้ได้กับทุกเชลล์เดียวที่ฉันเคยลองรวมถึง busybox / etc (initramfs) ฉันไม่เคยเห็นมันทำมาก่อนฉันค้นพบมันอย่างอิสระในขณะที่การผลิตใครจะรู้ว่าแหล่งข้อมูลสามารถรับ args ได้บ้าง แต่มันมักจะทำหน้าที่เป็นรูปแบบของการจัดการที่สามารถจัดการได้มากขึ้นถ้ามีสิ่งนั้น


2
ทำไมถึงลงคะแนน ... ดังนั้นถ้าคำถามเก่า; เห็นได้ชัดว่ามีความเกี่ยวข้องเนื่องจากมีคำตอบอีก 11 คำที่ดูด โซลูชันนี้คือ sans systemd วิธีที่เป็นที่ยอมรับและเป็นที่ยอมรับในการจัดการในช่วง 30 ปีที่ผ่านมาไม่ใช่แอปที่ไม่มีจุดหมายเช่น nohup และคณะ
anthonyrisinger

7
ไม่ว่าคำตอบของคุณจะออกมาดีแค่ไหนบางครั้งใครก็ตามที่อยู่ใน SO จะไม่ชอบและจะลดลง ดีกว่าที่จะไม่กังวลเกี่ยวกับมันมากเกินไป
Alex D

1
@ tbc0 ... ลองssh myhost "((exec sleep 500)&) >/dev/null"
anthonyrisinger

1
@anthonyrisinger ตกลงที่ได้ผล ฉันคิดว่ามันสะอาดกว่า: ssh myhost 'sleep 500 >&- 2>&- <&- &' TMTOWTDI;)
tbc0

1
มันเยี่ยมมาก ทางออกเดียวที่ใช้งานได้จริงใน busybox มันสมควรได้รับการโหวตมากขึ้น
Hamy

34
nohup blah &

แทนชื่อกระบวนการของคุณสำหรับ blah!


2
คุณอาจต้องการเพิ่มการเปลี่ยนเส้นทางออกมาตรฐานและข้อผิดพลาดมาตรฐาน
เดวิด Nehme

9
nohup เปลี่ยนเส้นทาง stdout และ stderr ไปยัง nohup.out (หรือ nohup.out และ nohup.err ขึ้นอยู่กับรุ่น) ดังนั้นหากคุณไม่ได้ใช้หลายคำสั่งก็ไม่จำเป็น
Chas Owens

17

ส่วนตัวฉันชอบคำสั่ง 'ชุด'

$ batch
> mycommand -x arg1 -y arg2 -z arg3
> ^D

สิ่งนี้จะเก็บไว้ในพื้นหลังแล้วส่งผลลัพธ์ให้คุณทางไปรษณีย์ มันเป็นส่วนหนึ่งของ cron


11

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

คุณสามารถค้นหาข้อมูลเกี่ยวกับกระบวนการที่น่ากลัวในหนังสือเช่น Stevens '"โปรแกรมเครือข่ายขั้นสูง, Vol 1, Edn 3" หรือ "Unix Programming ขั้นสูง" ของ Rochkind

ฉันเมื่อเร็ว ๆ นี้ (ในช่วงสองสามปีที่ผ่านมา) ต้องจัดการกับโปรแกรมการเหยียดหยามที่ไม่ได้ทำให้ตัวเองถูกต้อง ฉันจัดการกับสิ่งนั้นโดยการสร้างโปรแกรม daemonizing ทั่วไป - คล้ายกับ nohup แต่มีตัวควบคุมเพิ่มเติมให้ใช้

Usage: daemonize [-abchptxV][-d dir][-e err][-i in][-o out][-s sigs][-k fds][-m umask] -- command [args...]
  -V          print version and exit
  -a          output files in append mode (O_APPEND)
  -b          both output and error go to output file
  -c          create output files (O_CREAT)
  -d dir      change to given directory
  -e file     error file (standard error - /dev/null)
  -h          print help and exit
  -i file     input file (standard input - /dev/null)
  -k fd-list  keep file descriptors listed open
  -m umask    set umask (octal)
  -o file     output file (standard output - /dev/null)
  -s sig-list ignore signal numbers
  -t          truncate output files (O_TRUNC)
  -p          print daemon PID on original stdout
  -x          output files must be new (O_EXCL)

double-dash เป็นทางเลือกสำหรับระบบที่ไม่ได้ใช้ฟังก์ชัน GNU getopt () มันเป็นสิ่งที่จำเป็น (หรือคุณต้องระบุ POSIXLY_CORRECT ในสภาพแวดล้อม) บน Linux เป็นต้นเนื่องจากการใช้ double-dash ทำงานได้ทุกที่จึงควรใช้งาน

คุณยังสามารถติดต่อเราได้ (FirstName dot นามสกุลที่ gmail ดอทคอม) daemonizeถ้าคุณต้องการแหล่งสำหรับ

อย่างไรก็ตามรหัสนี้มีอยู่ใน GitHub ในที่เก็บ SOQ (Stack Overflow Questions) ของฉันเป็นไฟล์daemonize-1.10.tgzใน ไดเรกทอรีย่อยของแพ็คเกจ


13
ทำไมคุณไม่ใส่แหล่งที่มาใน GitHub หรือ Bitbucket?
Rob

5
เหตุใดการไม่มีแหล่งที่มาจาก github จึงรับประกันว่า downvote
Jonathan Leffler

7
@JonathanLeffler IMHO แสดงรายการตัวเลือกที่ยอดเยี่ยมทั้งหมดของโปรแกรมที่ไม่ได้เผยแพร่ต่อสาธารณะในทุกรูปแบบ
DepressedDaniel

7

บนระบบที่ใช้ Debian (บนเครื่องรีโมต) ติดตั้ง:

sudo apt-get install tmux

การใช้งาน:

tmux

เรียกใช้คำสั่งที่คุณต้องการ

ในการเปลี่ยนชื่อเซสชัน:

Ctrl + Bแล้ว$

ตั้งชื่อ

ในการออกจากเซสชัน:

Ctrl + Bแล้วD

(ซึ่งจะออกจากเซสชัน tmux) จากนั้นคุณสามารถออกจาก SSH

เมื่อคุณต้องการกลับมา / ตรวจสอบอีกครั้งให้เริ่ม SSH แล้วป้อน

tmux แนบ session_name

มันจะนำคุณกลับไปสู่เซสชั่น tmux ของคุณ


นี่คือวิธีที่จะไป
kilgoretrout

6

สำหรับกระบวนการส่วนใหญ่คุณสามารถหลอก - daemonize โดยใช้เคล็ดลับบรรทัดคำสั่ง Linux นี้:

# ((mycommand &)&)

ตัวอย่างเช่น:

# ((sleep 30 &)&)
# exit

จากนั้นเริ่มต้นหน้าต่างเทอร์มินัลใหม่และ:

# ps aux | grep sleep

จะแสดงว่าsleep 30ยังคงทำงานอยู่

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

ฉันชอบวิธีนี้ "ตั้งค่าและลืมมัน" วิธีการไม่จำเป็นต้องจัดการกับnohup, screenเปลี่ยนเส้นทาง, tmux, I / o หรือสิ่งใด ๆ


5

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

หากกระบวนการนี้จำเป็นต้องเรียกใช้เป็นประจำและคุณมีการเข้าถึงที่เพียงพอบนเซิร์ฟเวอร์ตัวเลือกที่ดีกว่าคือการใช้ cron ในการรันงาน คุณยังสามารถใช้ init.d (super daemon) เพื่อเริ่มกระบวนการของคุณในพื้นหลังและสามารถยุติทันทีที่เสร็จสิ้น


5

nohupดีมากถ้าคุณต้องการบันทึกรายละเอียดของคุณในไฟล์ แต่เมื่อไปถึงพื้นหลังคุณจะไม่สามารถกำหนดรหัสผ่านได้หากสคริปต์ของคุณร้องขอ screenผมคิดว่าคุณต้องลอง มันเป็นยูทิลิตี้ที่คุณสามารถติดตั้งในการแจกจ่าย linux ของคุณโดยใช้ yum เช่นบน CentOS yum install screenจากนั้นเข้าถึงเซิร์ฟเวอร์ของคุณผ่าน putty หรือซอฟต์แวร์อื่นในประเภทเชลล์ของคุณscreenแล้วเข้าถึงเซิร์ฟเวอร์ของคุณผ่านทางฉาบหรือซอฟต์แวร์อื่นในประเภทเปลือกของคุณมันจะเปิดหน้าจอ [0] ในผงสำหรับอุดรู ทำงานของคุณ. คุณสามารถสร้างหน้าจอมากขึ้น [1], หน้าจอ [2], และอื่น ๆ ในเซสชันโป๊วเดียวกัน

คำสั่งพื้นฐานที่คุณต้องรู้:

เพื่อเริ่มหน้าจอ

จอภาพ


การหน้าจอถัดไป Reate

Ctrl + A + C


เมื่อต้องการย้ายไปยังnหน้าจอต่อคุณสร้างขึ้น

Ctrl + A + n


ถึงd etach

Ctrl + A + d


ในระหว่างการทำงานปิดฉาบของคุณ และครั้งต่อไปเมื่อคุณเข้าสู่ระบบผ่านประเภทผงสำหรับอุดรู

หน้าจอ -r

หากต้องการเชื่อมต่อกับหน้าจอของคุณอีกครั้งและคุณสามารถเห็นกระบวนการของคุณยังคงทำงานอยู่บนหน้าจอ และเพื่อออกจากประเภทหน้าจอ #exit

man screenดูรายละเอียดเพิ่มเติม


สมมติว่าyumเป็นเครื่องมือที่เหมาะสมเมื่อคุณไม่รู้ distro ไม่ดี คุณควรทำให้ชัดเจนว่า distros ใดที่screenสามารถติดตั้งyumได้
tymik

5

Nohup อนุญาตให้กระบวนการไคลเอนต์ไม่ถูกฆ่าหากกระบวนการหลักถูกฆ่าเพื่อโต้แย้งเมื่อคุณออกจากระบบ ดียิ่งขึ้นยังคงใช้:

nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG  " > /dev/null

Nohup ทำให้กระบวนการที่คุณเริ่มภูมิคุ้มกันเพื่อยุติเซสชัน SSH ของคุณและกระบวนการลูกนั้นจะถูกฆ่าเมื่อคุณออกจากระบบ คำสั่งที่ฉันให้ไว้มีวิธีที่คุณสามารถเก็บ pid ของแอปพลิเคชันในไฟล์ pid เพื่อให้คุณสามารถฆ่ามันในภายหลังได้อย่างถูกต้องและอนุญาตให้กระบวนการทำงานหลังจากที่คุณออกจากระบบ




2

ฉันก็จะไปที่โปรแกรมหน้าจอ (ฉันรู้ว่าบางคนอื่นคำตอบก็คือหน้าจอ แต่นี่คือความสำเร็จ)

ไม่เพียง แต่ความจริงที่ว่า &, ctrl + z bg disown, nohup, ฯลฯ อาจทำให้คุณประหลาดใจที่น่ารังเกียจว่าเมื่อคุณออกจากระบบงานจะยังคงถูกฆ่า (ฉันไม่รู้สาเหตุ แต่มันเกิดขึ้นกับฉันและมันก็ไม่ได้ยุ่ง ด้วยสาเหตุที่ฉันเปลี่ยนไปใช้หน้าจอ แต่ฉันเดาว่าโซลูชัน anthonyrisinger เนื่องจากการฟอร์กสองครั้งจะแก้ปัญหานั้น) หน้าจอยังมีข้อได้เปรียบที่สำคัญมากกว่าเพียงแค่กราวด์แบ็คกราวด์:

screen will background your process without losing interactive control to it

และ btw นี่เป็นคำถามที่ฉันจะไม่ถามในตอนแรก :) ... ฉันใช้หน้าจอจากจุดเริ่มต้นของฉันทำอะไรในยูนิกซ์ใด ๆ ... ฉัน (เกือบ) ไม่เคยทำงานในเปลือกยูนิกซ์ / ลินุกซ์โดยไม่ต้องเริ่มหน้าจอ ก่อน ... และฉันควรจะหยุดตอนนี้หรือฉันจะเริ่มต้นการนำเสนอที่ไม่มีที่สิ้นสุดของหน้าจอที่ดีคืออะไรและสิ่งที่สามารถทำเพื่อ ya ... ค้นหาด้วยตัวเองมันคุ้มค่า;)


ป.ล. anthonyrisinger คุณเป็นคนดีฉันให้คุณ แต่ ... 30 ปี? ฉันเดิมพันที่เป็นวิธีแก้ปัญหาเมื่อ & BG, nohup หรือหน้าจอก็ไม่ได้มี แต่และไม่มีความผิดฉันขอขอบคุณความรู้ของคุณ แต่ที่อยู่ไกลซับซ้อนเกินไปที่จะใช้มัน :)
THESorcerer

2
(นอกเหนือ: ดู Tmux )แม้ว่านี้อย่างมากมายถือกำเนิดฉัน [1987] &(การดำเนินการไม่ตรงกัน) ถูกนำโดยธ อมป์สันเชลล์ในปี 1971สำหรับครั้งแรกรุ่นของ UNIX ... ดังนั้นมันอย่างแท้จริง "ได้เสมอ" ;-) อนิจจา ฉันหัวโบราณเกินไป - จริงๆแล้ว 41 ปีแล้ว
anthonyrisinger

2

นอกจากนี้ยังมีคำสั่งdaemonของแพคเกจ libslack โอเพ่นซอร์ส

daemon ค่อนข้างสามารถกำหนดค่าได้และดูแลเกี่ยวกับสิ่งที่น่าเบื่อทั้งหมดเช่นการรีสตาร์ทอัตโนมัติการบันทึกหรือการจัดการ pidfile


2

ต่อท้ายสตริงนี้เข้ากับคำสั่งของคุณ:> & - 2> & - <& - &. > & - หมายถึงปิด stdout 2> & - หมายถึงปิด stderr <& - หมายถึงปิด stdin & หมายถึงทำงานในพื้นหลัง วิธีนี้ใช้ในการเริ่มงานผ่านทางโปรแกรมโดย ssh เช่นกัน:

$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$


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

ไฟล์เรียกทำงานไบนารีนอกจากนี้ยังสามารถเรียกใช้โดยใช้ pm2 คุณต้องทำการเปลี่ยนแปลงในไฟล์ jason เปลี่ยน"exec_interpreter" : "node"ไปเป็น"exec_interpreter" : "none".(ดูที่ส่วนคุณลักษณะ )

#include <stdio.h>
#include <unistd.h>  //No standard C library
int main(void)
{
    printf("Hello World\n");
    sleep (100);
    printf("Hello World\n");

    return 0;
}

รวบรวมรหัสข้างต้น

gcc -o hello hello.c  

และรันด้วย np2 ในพื้นหลัง

pm2 start ./hello

สิ่งนี้สามารถใช้เพื่อเรียกใช้ไบนารีที่ปฏิบัติการได้หรือไม่?
GetFree

@รับฟรี; ใช่. คุณสามารถ.
haccks

โปรดเพิ่มตัวอย่าง คำตอบที่ถูกต้องในตอนนี้ดูเหมือนว่าจะดีสำหรับไฟล์สคริปต์เท่านั้น
GetFree

@รับฟรี; เพิ่มตัวอย่าง แจ้งให้เราทราบหากคุณมีปัญหาใด ๆ
haccks

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