วิธีเริ่มโปรแกรม GUI linux จากบรรทัดคำสั่ง แต่แยกจากบรรทัดคำสั่ง


89

ฉันเคยค้นหาสิ่งนี้มาก่อน แต่ไม่สามารถหาคำตอบได้

ใน Windows ถ้าฉันเปิดหน้าต่างคอนโซลให้พิมพ์winmineและกด Enter Minesweeper จะปรากฏขึ้นแยกจากโปรแกรม cmd โดยสิ้นเชิง อินสแตนซ์ Minesweeper ไม่ได้เชื่อมโยงกับพรอมต์คำสั่งในวิธีการใด ๆ ที่ฉันรู้ยกเว้นว่ามีการตั้งค่าพาเรนต์ของ Minesweeper กับอินสแตนซ์ของพรอมต์คำสั่งนั้น อย่างไรก็ตามมันแตกต่างใน Linux

ใน Linux ถ้าฉันเปิดหน้าต่างคอนโซลให้พิมพ์emacsและกด Enter Emacs จะเปิดขึ้น แต่ดูเหมือนจะเชื่อมโยงกับบรรทัดคำสั่ง โดยเฉพาะปรากฏว่าฉันไม่สามารถใช้บรรทัดคำสั่งได้อีกต่อไปจนกว่าอินสแตนซ์ของ Emacs นั้นจะปิด มีวิธีการเลียนแบบพฤติกรรม Windows ใน Linux หรือไม่?

ขอบคุณ!


1
ซ้ำ

กรุณาให้คำตอบกับ geekosaur
Joshua Robison

ใน windows7 เป็น minesweeper.exe ที่นี่ Games \ Minesweeper Files \ Microsoft C: \ Program ดังนั้น minesweeper.exe จะไม่ทำงานโดยทั่วไป .. เนื่องจากไดเรกทอรีนั้นไม่ได้อยู่ในเส้นทาง .. และคุณควรระบุเวอร์ชัน windows
barlop

คำตอบ:


10

ในbash, detachเป็นตัวในการใช้ดังนี้

emacs &
detach %+ # or % + the number in brackets printed after the above

ในzshคุณสามารถพื้นหลังและแยกออกในการดำเนินการเดียว

emacs &|

108

ผนวก&เข้ากับ commandline:

emacs &

สิ่งนี้จะทำให้ emacs อยู่ในพื้นหลังและช่วยให้คุณสามารถใช้เทอร์มินัลของคุณได้

โปรดทราบว่านี่จะยังคงปล่อย emacs ไว้เป็นกระบวนการย่อยของเทอร์มินัลของคุณและเมื่อคุณออกจากเทอร์มินัลก็จะออกจาก emacs เพื่อหลีกเลี่ยงปัญหานี้ให้พิมพ์:

(emacs &)

วงเล็บบอกให้เทอร์มินัลถอดกระบวนการ emacs ออกจากเทอร์มินัล

ยังคงข้อความ stdout และ stderr จากโปรแกรมจะปรากฏขึ้นบนสถานี เพื่อป้องกันสิ่งนี้ใช้:

(emacs &> /dev/null &)

9
ฉันชอบเคล็ดลับ (emacs &) เป็นพิเศษ

1
หากคุณได้เริ่มภารกิจ (emancs) แล้วให้ใช้ CTRL-Z เพื่อพักและใช้คำสั่ง "bg" เพื่อส่งไปยังพื้นหลัง
Jayan

@StackTrace: ถ้าคุณทำเช่นนั้นและปิดเทอร์มินัลมันจะฆ่า emacs ด้วย
Nathan Fellman

1
ตกลง .. ฉันเคยใช้ "nohup" ถอดนี่ ไม่สามารถทำได้เมื่อกระบวนการเริ่มต้นขึ้น ...
Jayan

เมื่อกดCtrl+ Cในหน้าต่างเทอร์มินัลคำสั่งนี้ได้รับการออกกระบวนการถูกฆ่า: <
Richard de Wit


19

ฉันโพสต์คำตอบไปยังเธรดที่เก่ากว่าของหัวข้อที่คล้ายกันพร้อมคำตอบจากแหล่งต่าง ๆ ต่อไปนี้เป็นสำเนาของคำตอบที่ดัดแปลงสำหรับเธรดนี้


ผลงานดังต่อไปนี้:

$ (gui_app &> /dev/null &)

นี่คือคำตอบของ Nathan Fellman พร้อมการเปลี่ยนเส้นทาง

"&> / dev / null" จะเปลี่ยนเส้นทางทั้ง stdout และ stderr ไปยังอุปกรณ์ null เครื่องหมายสุดท้ายและทำให้กระบวนการทำงานในพื้นหลัง วงเล็บรอบคำสั่งจะทำให้ "gui_app" ของคุณทำงานใน subshell

การทำเช่นนี้จะแยกกระบวนการ "gui_app" ออกจากคอนโซลที่คุณเรียกใช้คำสั่งนี้ ดังนั้นแม้ว่าคุณจะปิดหน้าต่างเทอร์มินัลเทอร์มินัลอีมูเลเตอร์กำลังทำงานอยู่ "gui_app" จะไม่ปิด ฉันวิ่งแล้วดูที่แผนผังกระบวนการด้วยคำสั่ง "pstree" และพบว่าแอปพลิเคชันเริ่มต้นด้วยวิธีนี้จะกลายเป็นกระบวนการลูกเพื่อ "init"

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

$ gui_app &> /dev/null &

จะเรียกใช้แอปพลิเคชันในพื้นหลัง แต่มันจะกลายเป็นกระบวนการลูกของกระบวนการคอนโซลและจะยุติลงเมื่อคุณปิดเทอร์มินัล (แม้ว่าการออกจากเทอร์มินัลผ่าน bash โดยใช้คำสั่ง exit หรือ Ctrl-D จะทำให้ bash ล้างข้อมูลโดยส่งกระบวนการเบื้องหลังเพื่อเริ่มต้น)

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

$ gui_app &
$ disown

(BTW ทั้งหมดนี้ใช้กับ bash ฉันแน่ใจว่า shell อื่นมีเมธอด / ไวยากรณ์อื่นสำหรับการทำเช่นนี้)

การอ้างอิงบางส่วน: การ แยกกระบวนการ (เครื่องมือไฟฟ้า UNIX)

หากเป็นการเรียกง่ายๆไปยังแอปพลิเคชัน GUI - โดยไม่มีตัวเลือกที่ซับซ้อนและดูเหมือนว่าการใช้ตัวเรียกใช้งานเช่น "gmrun" หรือdmenu (คำเตือน: เสียงดัง) ก็เป็นตัวเลือกที่ดีเช่นกัน ผูกไว้กับคีย์ผสม ฉันยังไม่ได้ใช้ตัวเรียกใช้ แต่ได้ลองทั้งสองตัวแล้ว

หมายเหตุ: CarlF ในข้อคิดเห็นของเธรดอื่นรายงานแอป GUI ที่เริ่มต้นด้วยวิธี "gui_app &" ไม่ปิดเมื่อเขาออกจากเทอร์มินัลหลัก ฉันคิดว่าเรากำลังปิดเครื่องด้วยวิธีที่ต่างกัน ฉันกำลังปิดหน้าต่างที่เทอร์มินัลอีมูเลเตอร์กำลังทำงานอยู่ฉันคิดว่าเขาอาจออกจากเทอร์มินัลอีมูเลเตอร์ผ่านเชลล์ (คำสั่ง exit หรือ Ctrl-D) ฉันทดสอบและเห็นว่าการออกจาก bash ไม่ได้หยุด GUI เริ่มต้นเนื่องจากกระบวนการพื้นหลังของเทอร์มินัลเช่นเดียวกับ CarlF กล่าว ดูเหมือนจะทุบตีกระบวนการพื้นหลังเพื่อเริ่มต้นเมื่อได้รับโอกาสในการทำความสะอาด ในความเป็นจริงนี้จะต้องเป็นกลไกที่กระบวนการพื้นหลังเริ่มต้นใน subshell ได้รับการส่งมอบให้ init


11

util-linux มีเครื่องมือที่เรียกว่า setsid ซึ่งโดยทั่วไปแล้วจะทำในสิ่งที่ detach ทำ:

$ setsid someprogram

สิ่งนี้จะทำงานsomeprogramในเซสชั่นใหม่


9

ลองพิมพ์xemacs &เพื่อเปิด XEmacs ในพื้นหลัง

โปรดอย่าอ้างถึงสิ่งนี้ว่า "การเลียนแบบพฤติกรรมของ Windows" อุ๊ยตาย

คุณสามารถ:

  • เปิดเทอร์มินัลใหม่
  • ใช้ Alt + F2 หรือตัวจัดการหน้าต่างของคุณเพื่อเปิดโปรแกรมแทนการใช้เทอร์มินัล
  • ใช้หน้าจอ GNU

7

ฉันใส่รหัสต่อไปนี้ในไฟล์สคริปต์ปฏิบัติการชื่อ "sbg" สำหรับ "พื้นหลังเงียบ" มันทำสิ่งที่จำเป็นทั้งหมดเพื่อยกเลิกการเชื่อมต่อโปรแกรมที่เริ่มต้นจากเชลล์โดยสมบูรณ์: เปลี่ยนเส้นทาง stdin, stdout และ stderr จาก / ไปยัง/dev/nullละเว้น hangups, ทำงานในพื้นหลังและแยกออก

#!/bin/bash
nohup "$@" &>/dev/null & disown %%

sbg emacsแล้วคุณก็สามารถทำได้ นอกจากนี้คุณยังสามารถส่งผ่านข้อโต้แย้งใด ๆ sbg emacs --daemon FILE1 FILE2ที่คุณต้องการ:


โซลูชันการเขียนสคริปต์ทำงานได้ดีที่สุดสำหรับฉัน ขอบคุณ !! แม้ว่าฉันจะใช้(gui_app &> /dev/null &)แทน (คำตอบของ @ EMPraptor)
Jimi Oke


3

หากคุณกำลังใช้ bash คุณสามารถปฏิเสธกระบวนการได้:

% firefox &
% disown 


1

ตามคำตอบอื่น ๆ คุณสามารถใช้คำสั่งต่อไปนี้:

$ emacs &

หากคุณลืมไป&เพียงกดCtrl-zจากนั้นใช้bg:

[1]+  Stopped                 emacs
$ bg
[1]+ emacs &
$

FYI: Ctrl-zหยุดกระบวนการ emacs และbgส่งเข้าสู่พื้นหลัง


0

เพียงแค่ใช้&เมื่ออยู่ใน$ x &กระบวนการที่แนบมากับเทอร์มินัลฉันเลือกโปรแกรมขนาดเล็กที่เรียกว่าdetach http://inglorion.net/software/detach/ซึ่งฉันใช้นามแฝงเนื่องจากdมันเป็นบิตเหมือนnohupแต่ไม่ทิ้งไฟล์บันทึกไว้ i ใช้เพื่อแยกmupdf :d mupdf x.pdf


0

นำสิ่งนี้ไปที่~/.bashrc:

debug_trap_skip()
{
    local cmd_type=$(type -t "$1")

    # Empty cmd_type is for inexistent command or variable definition, exclude them
    # and shell builtins except echo, set and env:
    [[ -z "$cmd_type" || "$cmd_type" = builtin && "$1" != echo && "$1" != set && "$1" != env ]] &&
        return 0

    return 1
}

debug_trap_x11()
{
    if ldd `which $1`|grep -q libX11
    then
        setsid "$@"
        return 0
    fi
    return 1
}

debug_trap()
{
    [[ -n "$COMP_LINE" ]] && return  # do nothing if completing
    [[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ]] && return
    debug_trap_skip $BASH_COMMAND && return 0
    debug_trap_x11 $BASH_COMMAND && return 1

    return 0
}

shopt -s extdebug
trap debug_trap DEBUG

ตอนนี้คุณไม่จำเป็นต้องจำว่าโปรแกรมใดเป็น X11 และทำกิจวัตรพิเศษสำหรับพวกเขาเพราะพวกเขาจะแยกออกโดยอัตโนมัติ โปรดทราบว่าsetsidดีกว่าnohupเพราะบล็อกล่าสุดบล็อกสัญญาณ HUP ซึ่งไม่ใช่สิ่งที่คุณต้องการ

ป.ล. ตอนนี้คุณwinmineพร้อมใน Linux แล้ว

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