วิธีการป้องกันไม่ให้แอปพลิเคชั่นเปิดตัวใน Terminal ออกจากที่ไม่พึงประสงค์


10

ฉันเปิดแอปพลิเคชันจาก Terminal ด้วยคำสั่งเช่นนี้:

/Applications/Mail.app/Contents/MacOS/Mail &

&ส่วนที่สำคัญคือ 

  • สำหรับ Unix / Linux / Solaris:

    • ฉันได้เรียนรู้ที่โรงเรียนว่าการเพิ่ม  &โปรแกรมทำให้อยู่ในตัวเขาเอง
    • ฉันจำได้ว่าเปิดใช้คำสั่งอย่างแรง  xeyes &และให้โปรแกรมทำงานอย่างปลอดภัยแม้หลังจากปิดเชลล์แล้ว
  • บน Mac OS X (Unix ข้างใน):

    1. ฉันเปิดแอพด้วย  &และปิดหน้าต่างเทอร์มินัล: แอปพลิเคชันออก!
    2. เหตุใดจึงมีพฤติกรรมที่ไม่พึงประสงค์เกิดขึ้นใน Mac OS X
    3. จะแก้ไขได้อย่างไร?

คำถามที่เกี่ยวข้อง: apple.stackexchange.com/q/119319/20773
Eric3

คำตอบ:


7

วิธี "มาตรฐาน" ในการทำสิ่งที่คุณต้องการให้สำเร็จ (บน OS X รวมถึงบน Linux, FreeBSD หรือระบบอื่น ๆ ) คือการใช้คำสั่งnohup:

nohup program &

สิ่งนี้จะเริ่มprogramขึ้นซึ่งจะทำงานในพื้นหลังที่สัมพันธ์กับเชลล์เนื่องจาก&- และจะละเว้นสัญญาณ Hangup เนื่องจากคำสั่ง nohup

วิธีนี้โปรแกรมจะทำงานต่อไปแม้ว่าคุณจะปิดเชลล์ ไม่สำคัญว่าคุณกำลังปิดเชลล์เพราะคุณปิด Terminal.app หรือคุณกำลังปิดเชลล์เพราะคุณกำลังตัดการเชื่อมต่อจากการเชื่อมต่อ ssh กับคอมพิวเตอร์หรือที่คล้ายกัน


1
สิ่งนี้จะสร้างไฟล์nohup.outในโฟลเดอร์ปัจจุบัน แม้ในขณะที่ไม่มีอะไรจะเขียน หลังจากสองสามสัปดาห์ฉันจะมีไฟล์nohup.outทุกที่ใน Mac ของฉัน :-(
Nicolas Barbulesco

1
@NicolasBarbulesco ใช้อย่างใดอย่างหนึ่งหรือnohup command>/dev/null& command&disown
Lri

6

เมื่อคุณปิดหน้าต่าง terminal, มันจะส่ง SIGHUP (สัญญาณ hangup) กับเปลือกที่แล้วส่ง SIGHUP กระบวนการทั้งหมดมันเริ่มต้น นี่เป็นพฤติกรรมแบบดั้งเดิมสำหรับทุบตีและกระสุนอื่น ๆ อีกมากมายและวิธีแก้ปัญหาแบบดั้งเดิมคือใช้ nohup

มีหลายวิธีที่เครื่อง Unix แตกต่างกันอาจแตกต่างกันดังนั้นจึงเป็นไปได้ว่าเทอร์มินัลอีมูเลเตอร์เฉพาะที่คุณใช้หรือเชลล์เฉพาะที่คุณใช้ทำงานแตกต่างกัน แต่มันไม่ได้เฉพาะเจาะจงกับ OS X ตัวอย่างเช่นมีคำถามเกี่ยวกับปัญหาเดียวกันนี้บน Ubuntu


6

การใช้เครื่องหมายและ " &" คุณกำลังบอกให้ Terminal เรียกใช้กระบวนการในพื้นหลังของเชลล์เอง ดังนั้นเมื่อคุณปิดเชลล์ (และฆ่ากระบวนการ) GUI (Mail.app เอง) ก็จะปิดเช่นกัน

คำสั่งที่ถูกต้องในการเรียกใช้ Mail จากเทอร์มินัลคือ

open -a Mail; exit

แก้ไข:ฉันเพิ่งพบสิ่งนี้ที่ U&L Stack Exchange: เครื่องหมายแอมเปอร์แซนด์หมายถึงอะไรในตอนท้ายของบรรทัดสคริปต์เชลล์? คำตอบที่ให้นั้นยอดเยี่ยมและอธิบายสิ่งที่เกิดขึ้นอย่างละเอียดและดีกว่าที่ฉันเคยทำได้! ฉันขอแนะนำให้อ่านมัน


แล้วการส่งต่อพารามิเตอร์บรรทัดคำสั่งไปยังแอป เช่นนี้:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco

2
@NicolasBarbulesco นั่นเป็นคำถามแยกต่างหาก - ดูman page สำหรับ openและฉันคิดว่าคำถามที่นี่
user151019

สิ่งที่เกี่ยวกับการเปิดตัวแอปพลิเคชันที่เฉพาะเจาะจงไม่ได้อยู่ใน/Applicationsแต่ในเส้นทางที่เฉพาะเจาะจง เช่นนี้:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco

@NicolasBarbulesco เปิด [เส้นทางแบบเต็ม] หรือ cd ไปยังไดเรกทอรีและเปิด [ไฟล์] คุณสามารถใช้ ~ / สำหรับโฮมโฟลเดอร์ของคุณและอักขระพิเศษ "asterisk" เนื่องจากสัญกรณ์ที่สั้นกว่าโดยที่ไม่มีสตริงอื่นที่ตรงกับค่า IE: ~ / De * / Fire * ... และอื่น ๆ หรือเพียงแค่เขียนสคริปต์ง่ายๆ: cat> nameofscript ..... #! / bin / sh .... open [full path] .... ^ D ..... chmod + x nameofscript ..... . \ nameofscript .... และตัวเลือก mv nameofscript $ PATH / yourpersonalbin แนะนำให้อ่านคนเปิด มันเป็นคำสั่งง่ายๆและในฐานะที่เป็นคำสั่งง่ายๆการแลกเปลี่ยนก็ไม่ได้ทรงพลัง
njboot

1
ขออภัยยังคงต้องใช้อาร์กิวเมนต์ -a:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot

4

ฉันได้ค้นพบวิธีแก้ปัญหา:

(/Applications/Mail.app/Contents/MacOS/Mail &)

มันง่ายมันสวยและใช้งานได้!

วงเล็บ  ( )เรียกคำสั่งใน sub-shell


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

3

@jksoegaard มีคำสั่งที่เหมาะสม แต่เมื่อคุณพูดถึงความคิดเห็นมันจะสร้างไฟล์ nohup.out หากต้องการหยุดการสร้างไฟล์ nohup.out คุณต้องเปลี่ยนเส้นทาง STDOUT และ STDERR ที่อื่น nohup program &>/dev/null &คำสั่งที่สมบูรณ์จะเป็น สิ่งนี้จะเรียกใช้โปรแกรมของคุณในพื้นหลังละเว้น SIGHUP และส่ง STDOUT และ STDERR ทั้งหมดไปที่ / dev / null

อย่างไรก็ตามหากคุณจำไม่ได้ว่าจะเพิ่ม nohup (เช่นในคำถามเดิมของคุณ) คุณสามารถใช้disown -arhคำสั่งเพื่อทำเครื่องหมายงานที่ทำงานอยู่เบื้องหลังทั้งหมดเพื่อละเว้น SIGHUP


คำตอบที่ดี แต่ก็ยังซับซ้อน และภาพโปรไฟล์ที่ดี :-)
Nicolas Barbulesco

0

หรือคุณสามารถลอง open -a /Applications/Mail.app

การใช้งาน: เปิด [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-h] [-s] [- b] [- a] [ชื่อไฟล์] [- อาร์กิวเมนต์อาร์กิวเมนต์]
ช่วย: เปิดเปิดไฟล์จากเชลล์
      ตามค่าเริ่มต้นเปิดแต่ละไฟล์โดยใช้แอปพลิเคชันเริ่มต้นสำหรับไฟล์นั้น
      หากไฟล์อยู่ในรูปแบบของ URL ไฟล์จะถูกเปิดเป็น URL
ตัวเลือก:
      -a เปิดด้วยแอปพลิเคชันที่ระบุ
      -b เปิดพร้อมกับตัวระบุบันเดิลของแอ็พพลิเคชันที่ระบุ
      -e เปิดด้วย TextEdit
      -t เปิดพร้อมตัวแก้ไขข้อความเริ่มต้น
      -f อ่านอินพุตจากอินพุตมาตรฐานและเปิดด้วย TextEdit
      -F --fresh เปิดตัวแอปใหม่นั่นคือโดยไม่ต้องกู้คืน windows สถานะถาวรที่บันทึกไว้จะสูญหายไปยกเว้นเอกสารที่ไม่มีชื่อ
      -R, - เปิดเผยเลือกใน Finder แทนที่จะเปิด
      -W, - รอแอปปิดกั้นจนกว่าแอปพลิเคชันที่ใช้จะถูกปิด (แม้ว่าพวกเขาจะทำงานอยู่แล้ว)
          - อาร์กิวเมนต์อาร์กิวเมนต์ที่เหลือทั้งหมดจะถูกส่งผ่านใน argv ไปยังฟังก์ชัน main () ของแอปพลิเคชันแทนการเปิด
      -n, - ใหม่เปิดอินสแตนซ์ใหม่ของแอปพลิเคชันแม้ว่าจะมีอยู่แล้วทำงานอยู่
      -j, - ซ่อนเปิดแอปที่ซ่อนอยู่
      -g, - พื้นหลังไม่ได้นำใบสมัครไปยังเบื้องหน้า
      -h, --header ค้นหาตำแหน่งไฟล์ส่วนหัวสำหรับส่วนหัวที่ตรงกับชื่อไฟล์ที่กำหนดและเปิดพวกเขา
      -s สำหรับ -h, SDK ที่ใช้; หากให้มาจะมีการค้นหาเฉพาะ SDK ที่ชื่อมีค่าอาร์กิวเมนต์
                        มิฉะนั้นจะใช้ SDK เวอร์ชันสูงสุดในแต่ละแพลตฟอร์ม

-2

ฉันพบวิธีแก้ไขแล้ว: ต่อสู้กับปีศาจร้ายด้วยความชั่วร้าย

ฉันเปิดแอพของฉันด้วยคำสั่งประเภทนี้:

/Applications/Mail.app/Contents/MacOS/Mail & exit

เชลล์ออกทันที และแอพยังมีชีวิตอยู่แม้หลังจากที่ฉันปิดหน้าต่างเทอร์มินัล

แต่วิธีนี้ไม่ได้มีประโยชน์มาก


1
จริงๆคุณควรจะเปิดโปรแกรมที่มาพร้อมกับการเปิด นั่นเป็นข้อพิสูจน์ในอนาคตเมื่อเนื้อหาของบันเดิลเปลี่ยนแปลงเช่นเดียวกับบัญญัติ
Ian C.

@Ian - ที่นี่ฉันสนใจเป็นพิเศษในการเปิดแอปพลิเคชั่นที่อยู่ในเส้นทางเฉพาะไม่ใช่ใน/Applicationsและไม่ได้รวมอยู่ใน Mac ของฉัน
Nicolas Barbulesco

1
.appโฟลเดอร์เรียกว่า "บันเดิล" และopenคำสั่งสามารถเปิดใช้งานได้ไม่ว่าจะอยู่ใน/Applicationsโฟลเดอร์หรือโฟลเดอร์อื่น ๆ คำว่า "มัด" ในบริบทนี้ไม่ได้หมายความว่า "ส่งมาพร้อมกับ OS X"
ไม่มีใคร

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