จะเปิดแอพ GUI ผ่านเทอร์มินัลได้อย่างไร


78

แอพ GUI บางตัวเริ่มทำงานอย่างหมดจดผ่านบรรทัดคำสั่ง Terminal แต่บางตัวก็ไม่ทำเช่นนั้นและทำให้ Terminal ต้องรอให้แอปยุติลง ถึงอย่างนั้นบางคนก็ไม่ "ปล่อย" บรรทัดคำสั่ง

เครื่องหมายแอมเปอร์แซนด์และ&ส่วนต่อท้ายที่ลึกลับทำให้เทอร์มินัลใส่กระบวนการลงในพื้นหลัง (แต่ฉันไม่แน่ใจว่าเกิดอะไรขึ้นที่นั่น)

มีวิธีที่จะเปิดตัวแอปผ่านทางสถานีเพื่อให้ไม่มี "แขวนบน" ผลเช่นเดียวกับการเปิดตัวสิ่งที่ผ่านAlt+ F2?

ฉันต้องการให้บรรทัดคำสั่งพร้อมใช้งานอีกครั้งทันทีโดยไม่มีสิ่งใดอยู่ในพื้นหลังและพิมพ์ในเทอร์มินัล


ฉันขอลบคำตอบของเขาที่คุณยอมรับตามคำร้องขอของ htorque โปรดคุณเลือกคำตอบอื่นได้ (คุณจะต้องยกเลิกการเลือก htorque ก่อน - ควรซุ่มอยู่ที่ด้านล่างของหน้าเป็นสีแดง)
Oli

1
วิธีการที่จะจัดการกับโปรแกรมแล้วทำงาน (ตามที่ระบุไว้โดย Con-F-ใช้งาน) เป็นสิ่งที่ดีสำหรับสถานการณ์ที่ แต่เป็นคำถามหลักของฉันเป็นเรื่องเกี่ยวกับการทำความสะอาดเปิดตัวโดยไม่มีการถ่วงสถานีฉันได้รับการยอมรับscreen(กล่าวโดย Oli และ RobinJ) ฉันประทับใจในความสามารถของมัน หลังจากที่ได้อ่านเกี่ยวกับมันและพยายามออก ... แต่จะต้องพิมพ์ของ: screen -d -m gedit(หรือscreen geditแล้วCtrl+a dที่จะแยกออก) ... และฉันยังคงมีการเข้าถึงแบบเต็มไปยังมุมมองขั้ว Gedit ของ (สำหรับข้อความแจ้งเตือน ฯลฯ ) ได้ตลอดเวลาผ่านscreen -rแม้ว่าผม ได้ปิดหน้าต่างเทอร์มินัลดั้งเดิมในเวลาเดียวกัน ...
Peter.O

BTW บางสิ่งที่คุณอ้างถึงเทอร์มินัลนั้นทำโดยเชลล์จริง ๆ เช่นการตีความ&คำต่อท้ายคำสั่ง สิ่งนี้อาจมีประโยชน์สำหรับการชี้แจง: อะไรคือความแตกต่างระหว่าง Terminal, Console, Shell และ Command Line
wjandrea

คำตอบ:


17

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

สำหรับสิ่งอื่น ๆ สิ่งที่คนอื่นพูดก็ใช้ได้เหมือนกัน ฉันเป็นแฟนของnohup... แต่ถ้าคุณต้องการขั้วคุณสามารถถอด screenแต่แล้วอีกแนบไปกับคุณต้องการดู

  1. เรียกใช้ในเทอร์มินัลแล้วเรียกใช้บางสิ่งบางอย่างที่ช่วยผลักดันเอาต์พุต ฉันใช้เซิร์ฟเวอร์การพัฒนา Django แต่irssiหรือwatch uptimeอาจเป็นตัวอย่างที่ดี
  2. ฆ่า terminal และเริ่มใหม่
  3. เรียกใช้screen -rและบูมคุณกลับมาแล้ว

screenใหญ่กว่านั้นมากและคุณสามารถรวมเข้ากับbyobuเทอร์มินัลเพื่อประสบการณ์การใช้งานที่ดียิ่งขึ้น อ่านรอบ ๆ


นี่เป็นข้อมูลเชิงลึกที่แท้จริงครั้งแรกที่ฉันได้เห็นว่าหน้าจอทำอะไร / สามารถทำได้ ... ขอบคุณสำหรับเคล็ดลับขั้ว ...
Peter.O

ไม่สามารถใช้งานหน้าจอได้อีกต่อไป แต่ tmux สามารถแทนที่หน้าจอได้ (tmux เพื่อเริ่มเซสชั่น tmux ใหม่, ctrl + b, จากนั้นกด d เพื่อ deatach, และ tmux แนบกับ reattach)
Gman Smith

84

สมมติว่าgeditเป็นโปรแกรมที่คุณต้องการรันเดี่ยว (aka. "disowned", "disentangled", "decoupled") มีหลายวิธีขึ้นอยู่กับสิ่งที่คุณต้องการทำ:

โปรแกรมกำลังทำงานอยู่

บอกปัด:

disown -hเป็นวิธีที่จะไปถ้าคุณต้องการที่จะทำกับโปรแกรมที่ทำงานอยู่แล้ว (เช่นถ้าคุณลืมnohupมัน) แรกที่คุณต้องหยุดมันใช้+Ctrl Zจากนั้นคุณสามารถใส่พื้นหลังโดยใช้bg [jobId](เช่นbg 1) คุณจะได้รับรายการของการใช้งานที่มีรูปแบบของ jobID jobsของตนโดยใช้ disown -h %[jobId]หลังจากที่คุณสามารถแยกได้จากขั้วใช้ ตัวอย่างเทอร์มินัล:

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

โปรแกรมยังไม่เริ่ม

nohup

nohupอาจไม่ปรากฏบนทุกเครื่องเสมอไป หากคุณรู้ว่าคุณต้องการแยกชิ้นส่วนก่อนคุณจะใช้:

nohup gedit &

nohup ./myprogram > foo.out 2> bar.err < /dev/null &บางทีคุณอาจจะต้องการที่จะเปลี่ยนเส้นทางออกเปลือกเป็นอย่างดีและโปรแกรมของคุณแหล่งสัญญาณหลอกเพื่อ: คุณต้องการเปลี่ยนเส้นทางผลลัพธ์เพื่อไม่ให้รำคาญหรือใช้ในภายหลัง อินพุตแบบ null สามารถช่วยป้องกัน hickups ใน ssh เช่นนั้นได้

subshell:

คุณสามารถบรรลุผลที่คล้ายกันโดย

$ (geany >/dev/null 2>&1 &)

วงเล็บเปิด>/dev/null 2>&1เชลล์ย่อยใหม่เพื่อเรียกใช้ gedit ระบบจะเปลี่ยนเส้นทางของเอาต์พุตเชลล์ไปที่ใด ๆ (ไม่แสดงผลลัพธ์) และ&ในตอนท้ายทำให้กระบวนการในพื้นหลัง

เทอร์มินัลมัลติเพล็กซ์

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

ที่มีประโยชน์:

  • F2 สร้างหน้าต่างใหม่
  • F3 ย้ายไปที่หน้าต่างถัดไป
  • F4 ย้ายไปที่หน้าต่างก่อนหน้า
  • F6 แยกออกจากเซสชันและออกจากระบบ
  • Shift-F6 แยกออกจากเซสชัน แต่อย่าออกจากระบบ
  • F7 เข้าสู่โหมดเลื่อน / ค้นหา
  • Ctrl-F5 เชื่อมต่อซ็อกเก็ตหรือตัวแทน SSH / GPG ใหม่

มีประโยชน์น้อยกว่า:

  • Shift-F2 แยกหน้าจอในแนวนอน
  • Ctrl-F2 แยกหน้าจอในแนวตั้ง
  • Shift-F3 ย้ายโฟกัสไปที่การแยกต่อไป
  • Shift-F4 ย้ายโฟกัสไปที่ตัวแบ่งก่อนหน้า
  • Shift-F5 ยุบแยกทั้งหมด
  • F5 รีเฟรชการแจ้งเตือนสถานะทั้งหมด
  • F8 เปลี่ยนชื่อหน้าต่างปัจจุบัน
  • F9 เรียกใช้เมนูการตั้งค่า Byobu
  • F12 คีย์ Escape ของหน้าจอ GNU
  • Alt-Pageup เลื่อนดูประวัติของหน้าต่างนี้
  • Alt-Pagedown เลื่อนไปข้างหน้าผ่านประวัติของหน้าต่างนี้
  • Ctrl-a-! สลับการเปิดหรือปิดการป้อนคีย์ของ Byobu ทั้งหมด

The 'at' daemon และอื่น ๆ

atเป็นเครื่องมือเล็ก ๆ ที่มีประโยชน์ที่ดีในการเรียกใช้คำสั่งในเวลาที่กำหนด สามารถ 'นำไปใช้ในทางที่ผิด' เพื่อแยกคำสั่งจากเชลล์:

echo './myprogram myoption1 myoption2' | at now

นอกจากนี้คุณสามารถดูsetsidและstart-stop-daemonแต่วิธีอื่นควรพอเพียง


เคล็ดลับ: ถ้ามีเพียงหนึ่งงาน ID งานเป็นตัวเลือกเช่นแทนที่จะเป็นคุณก็สามารถพิมพ์bg %1 bg
MasterMastic

25

เครื่องหมายแอมเปอร์แซนด์ "&" ต่อท้ายดูเหมือนว่าจะทำให้เทอร์มินัลใส่กระบวนการเข้าไปในพื้นหลัง ... (แต่ฉันไม่แน่ใจว่าเกิดอะไรขึ้นที่นั่น)

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

กระบวนการ 'stdin, stdout และ stderr ยังคงเชื่อมต่อกับเทอร์มินัล คุณสามารถเปลี่ยนเส้นทางไฟล์เหล่านั้นจาก / ถึง / dev / null หรือไฟล์อื่น ๆ (เช่นบันทึกบันทึกผลลัพธ์บางแห่ง) ตามที่ต้องการ:

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

คุณสามารถดูกระบวนการในงานนำกลับไปที่เบื้องหน้า (คำสั่ง fg) และส่งสัญญาณ (คำสั่ง kill)

โปรแกรมกราฟิกบางโปรแกรมจะแยกออกจากเครื่อง หากเป็นกรณีนี้เมื่อคุณเรียกใช้คำสั่ง "ปกติ" คุณจะสังเกตเห็นว่ามันเริ่มต้นโปรแกรมกราฟิกและ "ออก"


นี่เป็นสคริปต์สั้น ๆคุณสามารถวางไว้ใน~ / binซึ่งฉันชื่อ runbg:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

ฉันค้นหาโปรแกรม ($ prog) ก่อนที่จะเปลี่ยนเส้นทางดังนั้นข้อผิดพลาดในการค้นหานั้นสามารถรายงานได้ เรียกใช้เป็น "runbg your-command args ... "; คุณยังสามารถเปลี่ยนเส้นทาง stdout / err ไปยังไฟล์ได้หากคุณต้องการบันทึกผลลัพธ์ไว้ที่ใดที่หนึ่ง

ยกเว้นสำหรับการเปลี่ยนเส้นทางและข้อผิดพลาดการจัดการนี้จะเทียบเท่ากับคำตอบของ htorque


โอเคขอบคุณ ... ดูเหมือนว่าctrl-z(หยุดชั่วคราว) ทำให้ฉันสามารถเข้าถึงบรรทัดคำสั่งได้อีกครั้ง แต่ไม่ว่าง GUI จนกว่าฉันจะออกbgซึ่งดูเหมือนว่าจะยกเลิกการระงับ (เข้าท่า) ... มีอีกคำสั่งที่ฉันสามารถแยก GUI ... Aha! ตอนนี้ฉันเห็นสิ่งที่คุณหมายถึงโดยsighals (kill command)... (สิ่งที่น่าสนใจสัญญาณเหล่านี้) .. ฉันใช้โค้ดขนาดเล็กเพื่อddส่งออกสถิติอย่างต่อเนื่อง .. และมันใช้kill+ a สัญญาณ ... มีสัญญาณเฉพาะเพื่อแยกงาน " "?
Peter.O

ฉันเพิ่งสังเกตเห็นความคิดเห็นของคุณต่อคำตอบของ Rick ... ฉันลองใช้ disown งาน -p gedit`` และดูเหมือนว่าจะลบงาน .... (แต่ฉันได้รับข้อความของระบบใน Terminal เมื่อฉันปิด gedit ด้วยตนเอง ... แต่ฉันคิดว่า ฉันมีเทอร์มินัลที่เมาแล้วในตอนนี้ ... กำลังทดลองมากเกินไป:(
Peter.O

@fred: งานถูกจัดการโดยเชลล์ดังนั้นจึงไม่มีสัญญาณใดสามารถควบคุมได้ คุณอาจพบว่ามันทำงานได้ดีที่สุดในการเริ่มเชลล์หลายอัน - เทอร์มินัล GUI หลายตัวอนุญาตแท็บและคุณสามารถใช้หน้าจอหรือ tmux

2
@fred: ดีกว่าไม่ทำงานjobs -p commandหากคุณมีหลายอินสแตนซ์ของคำสั่งเดียวที่ทำงานในพื้นหลังพร้อมกัน คุณสามารถใช้jobsเพื่อค้นหา id งานที่ถูกต้องจากนั้นทำjobs -p <job-id>เพื่อรับ PID ของงาน โดยส่วนตัวแล้วฉันค้นหารุ่นที่มี subshell ได้ง่ายกว่ามาก ;-)
htorque

2
@htorque, fred: คุณสามารถเรียกใช้การปฏิเสธโดยไม่มีพารามิเตอร์เพื่อทุบตีปฏิเสธงานล่าสุด:gedit & disown

22

ในการเริ่มต้นแอปพลิเคชันและแยกออกจากการใช้งานเทอร์มินัลที่เปิดใช้ &!

firefox &!

6
เป็นการดีที่จะทราบ แต่ดูเหมือนว่าจะเป็น zsh-only ในทุบตีคุณจะต้องเรียกใช้ด้วยตนเองdisown <pid-of-command>หลังจากเริ่มคำสั่งในพื้นหลัง
htorque

ที่น่าสนใจ ... ฉันจะดูเป็น zsh แต่ในฐานะมือใหม่ Linux ฉันจะติดอยู่กับทุบตีตอนนี้ ... ขอบคุณ
Peter.O

เครื่องหมายอัศเจรีย์ทำอะไร
บ๊องเกี่ยวกับ natty

1
ตัว! จะทำให้แอปพลิเคชั่นแตกหักจากกระบวนการเทอร์มินัลเพื่อให้คุณสามารถปิดเทอร์มินัลได้โดยไม่ต้องเปิดแอปพลิเคชันที่เปิดตัว ดูเหมือนว่าจะเป็นสิ่งที่ zsh แต่มีประโยชน์
Rick

แต่สิ่งนี้ใช้ได้กับทุบตีด้วย @htorque .... ดังนั้นฉันเดาว่ามันไม่ใช่ปัญหา
Jasser

20

ใช้ nohup

nohup เป็นโปรแกรมที่รันคำสั่งที่กำหนดพร้อมกับสัญญาณ hangup ที่ถูกละเว้นดังนั้นคำสั่งสามารถทำงานต่อในพื้นหลังหลังจากกระบวนการหลักสิ้นสุดลง ดูmanpage

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

nohup gedit something

2
คือnohupอะไร กรุณาอธิบายอย่างละเอียด
Oxwivi

3
nohup เป็นโปรแกรมที่รันคำสั่งที่กำหนดพร้อมกับสัญญาณ hangup ที่ถูกละเว้นดังนั้นคำสั่งสามารถทำงานต่อในพื้นหลังหลังจากกระบวนการหลักสิ้นสุดลง ดูmanpage
Florian Diesch

ที่จริงฉันคิดว่าคำตอบของฉันไม่ถูกต้องที่นี่ ในความคิดเพิ่มเติมnohupควรใช้ในสถานการณ์นี้
boehj

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

2
สิ่งหนึ่งที่ต้องระวังคือการที่สร้างแฟ้มในไดเรกทอรีปัจจุบันเรียกว่าnohup nohup.outดูหน้าคนสำหรับรายละเอียดเพิ่มเติม ฉันชอบdisownด้วยเหตุผลนี้และความจริงที่ว่าทำงานหลังจากการเปิดตัวคุณdisown gedit
Flimm

4

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


หน้าจอ GNU คืออะไร
Oxwivi

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

Byobu?
Oxwivi

บางสิ่งเช่นนั้นมีเพียง Byobu เท่านั้นที่ใช้งานง่ายกว่า ถ้าฉันเข้าใจผิด, Byobu เป็นเพียงส่วนต่อประสานที่ง่ายขึ้นสำหรับหน้าจอ GNU
RobinJ


1

XDG เปิด

ดูที่ยูทิลิตี้เอนกประสงค์นี้: https://linux.die.net/man/1/xdg-open

นี่จะเป็นการเปิดตำแหน่งที่สัมพันธ์กันในตัวจัดการไฟล์ของคุณ

 $ xdg-open .

นี่จะเป็นการเปิดไฟล์ pdf ในโปรแกรมอ่าน pdf

 $ xdg-open foo.pdf

คุณสามารถระบุ URL ของเว็บได้

$ xdg-open www.google.com

0

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

nohup gedit & exit

และนั่นคือมัน มันเปิด gedit และปิดเทอร์มินัลเมื่อ gedit เริ่มทำงาน เนื่องจาก gedit ไม่ได้เชื่อมโยงกับเทอร์มินัลในขณะนี้จึงยังคงทำงานอยู่


0

วิธีนี้ใช้ได้แม้ในสคริปต์ (เช่นเดียวกับนามแฝงตัวอย่าง '&' ไม่ได้รับอนุญาตในสคริปต์เพราะมันไม่ได้มีการโต้ตอบ):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'

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