บันทึกแอปพลิเคชันที่เปิดอยู่และสถานะแท็บเป็นไฟล์และสามารถกู้คืนได้


6

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

ฉันค้นหาแอปพลิเคชันที่ชื่อว่าKeyboard Maestroแต่ดูเหมือนว่าจะไม่สามารถบันทึกแอปพลิเคชันและแท็บที่เปิดอยู่โดยพลการแทนคุณสร้างมาโครเฉพาะ

ด้วย AppleScript บางทีฉันสามารถใช้รายการแอปพลิเคชันที่เปิดอยู่:

osascript -e 'tell application "System Events" to get name of every process where visible is true'

แต่ฉันไม่แน่ใจว่าจะไปจากที่นั่นหรือถ้าเป็นไปได้

บางทีฉันควรจะดูในเซสชันผู้ใช้แทน มีคนแนะนำว่าฉันควรทำข้อมูลให้ตรงกัน~/Library/Preferences/ByHost/com.apple.loginwindow.*ในคอมพิวเตอร์สองเครื่อง แต่ฉันไม่แน่ใจว่าเพียงอย่างเดียวจะพอเพียงและบังคับให้ฉันออกจากระบบและลงชื่อเข้าใช้อีกครั้งซึ่งฉันไม่ต้องการ

ตัวชี้ใด ๆ เกี่ยวกับวิธีการบรรลุสิ่งนี้?

ขอบเขต

การไม่สามารถใช้โปรแกรม "hot reload" ไม่ใช่ปัญหา ตำแหน่งหน้าต่างไม่ใช่ตำแหน่งใดตำแหน่งหนึ่ง หากกดแป้นพิมพ์ฉันสามารถปิดทุกอย่างและเปิดแอปพลิเคชันจากไฟล์สถานะที่บันทึกไว้นั่นจะเพียงพอ ส่วนใหญ่เกี่ยวกับแอพที่เปิดไฟล์ที่ฉันเปิดในคอมพิวเตอร์เครื่องอื่น ถ้าฉันสามารถมีมากกว่าหนึ่งสถานะที่บันทึกไว้ (เช่นหนึ่งต่อโครงการ) นั่นจะยอดเยี่ยม หากฉันสามารถรับรหัสเริ่มต้นฉันสามารถนำรหัสนั้นมาได้


ฉันไม่เห็นสาเหตุที่เป็นไปไม่ได้หากเครื่องของคุณทั้งสองมีการเข้าถึงระบบไฟล์ที่แชร์ซึ่งสามารถอ่าน / เขียนข้อมูลไปยังไฟล์ SavedState ได้ คุณจะทำสิ่งนี้ให้สำเร็จได้อย่างไร? iCloudโฟลเดอร์อาจจะเหมาะหรือDropboxโฟลเดอร์ หากเครื่องของคุณสามารถเข้าถึงที่อยู่ IP คงที่ผ่านอินเทอร์เน็ตคุณสามารถส่งเหตุการณ์ Apple จาก AppleScript ระหว่างกันได้ แต่ฉันคิดว่านี่จะไม่ใช่วิธีแรกที่จะลอง ฉันโน้มตัวไปทางสคริปต์ในคอมพิวเตอร์แต่ละเครื่องและไฟล์ SavedState ที่แชร์ซึ่งซิงค์ระหว่างทั้งสอง
CJK

นั่นคือเป้าหมาย คำถามก็คือว่า มีคนแนะนำว่าฉันทำข้อมูลให้ตรงกัน~/Library/Preferences/ByHost/com.apple.loginwindow.*ในคอมพิวเตอร์ทั้งสองเครื่อง
ajf-

เพียงอย่างเดียวนั้นไม่เพียงพอ แต่หลักฐานก็เป็นสิ่งที่ดี ฉันจะคิดและกลับไปหาคุณ มีเฉพาะ.savedstateไฟล์แอปพลิเคชันต่อหนึ่งดังนั้นฉันจะดูว่า
CJK

ขอบคุณ! ฉันได้รับรางวัลมากมายเช่นกันเพื่อดูว่าฉันสามารถดึงดูดความสนใจได้หรือไม่ ตามคำแนะนำของคุณฉันได้รับการ~/Library/Saved Application State/ตรวจสอบ ดูเหมือนว่าการซิงโครไนซ์ไดเรกทอรี + แอปพลิเคชันเพื่อให้ทราบว่าแอปพลิเคชันที่จะเปิดสามารถทำเคล็ดลับได้หรือไม่
ajf-

คำตอบ:


2

หมายเหตุ: คำตอบยังอยู่ระหว่างการก่อสร้าง ...

อีกหนึ่งส่วนที่จะเขียนโดยมีรายละเอียดสคริปต์ที่จะซิงค์สถานะการทำงานของแอปพลิเคชัน ฉันต้องเขียนสคริปต์เหล่านี้ก่อน


วัตถุประสงค์

แฉ่งประดิษฐ์หมายถึงสองแม็คเพื่อบันทึกและแบ่งปันข้อมูลเกี่ยวกับสภาพแวดล้อมของผู้ใช้รวมถึงการประยุกต์ใช้รัฐ / คุณสมบัติเอกสารการโหลดและการใช้งานที่ทำงานอย่างแข็งขัน

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

ระเบียบวิธีเชิงมโนทัศน์

1. สองสคริปต์ + ไฟล์ข้อมูลที่ใช้ร่วมกัน

แนวคิดแรกของฉันคือการมีสำเนาของสคริปต์ (อาจเป็น AppleScript) ในแต่ละเครื่องที่จะมีตัวจัดการที่รับผิดชอบในการรับข้อมูลเกี่ยวกับสภาพแวดล้อมของแอปพลิเคชันและจัดเก็บไว้ในไฟล์ที่แชร์ซึ่งเครื่องทั้งสองจะสามารถเข้าถึงได้ (เช่น ผ่านDropbox , iCloud , ... ) สคริปต์จะมีตัวจัดการแยกต่างหากที่จะดึงเนื้อหาของไฟล์ที่แชร์นี้และใช้การตั้งค่ากับสภาพแวดล้อมในท้องถิ่น สิ่งนี้ต้องการให้ผู้ใช้เรียกใช้สคริปต์เมื่อมาถึงเครื่องเพื่อใช้การตั้งค่า และอีกครั้งก่อนออกจากเครื่องเพื่ออัปเดตไฟล์ข้อมูลที่ใช้ร่วมกันด้วยการตั้งค่าใหม่

2. การ.savedStateประสาน

~/Library/Preferences/ByHost/com.apple.loginwindow.*ความคิดที่สองของฉันได้แรงบันดาลใจจากความคิดของคนอื่นของซิงค์ไฟล์อยู่ที่ แม้ว่าการทำเช่นนั้นจะไม่เป็นประโยชน์ แต่ก็ทำให้เกิดคำถามว่าการซิงโครไนซ์.savedStateไฟล์ที่พบในโฟลเดอร์~/Library/Saved Application Stateจะเป็นวิธีแก้ปัญหาหรือไม่

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

ฉันสงสัยว่าจะต้องใช้ทั้งสองวิธีร่วมกัน

ซิงค์

ซิงค์~/โฟลเดอร์ผ่าน Dropbox

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

ท้ายที่สุดถ้าซิงค์โฟลเดอร์ที่บ้านจะถูก จำกัดDownloads, Documents, MusicและMoviesมันเป็นไปไม่มากของผลประโยชน์มากกว่าการมีDocumentsและDesktopโฟลเดอร์ที่ซิงค์ผ่านiCloud

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

กำลังซิงค์~/Libraryโฟลเดอร์

~/Libraryโฟลเดอร์หรืออย่างน้อยโฟลเดอร์ย่อยของมันที่เฉพาะเจาะจงจะเป็นเป้าหมายสำคัญหากใคร่ครวญโดยใช้.savedStateไฟล์ไปยังแผนที่รัฐแอพลิเคชันจากระบบหนึ่งไปยังอีก โซลูชันการจัดเก็บข้อมูลบนคลาวด์ในบ้านเหมาะสำหรับงานนี้เนื่องจากไม่เก็บค่าธรรมเนียมการสมัคร ข้อมูลสำคัญของคุณจะปลอดภัยอยู่ในความครอบครองของคุณและไม่ได้เป็นเจ้าของDropboxหรือแอปเปิ้ล ; และจะไม่มีการควบคุมความเร็วที่นอกเหนือจากที่ ISP ของคุณกำหนดไว้หากทำการซิงค์ผ่านอินเทอร์เน็ต

ฉันใช้Resilio Syncแล้วซึ่งเป็นบริการฟรีสำหรับการใช้งานส่วนบุคคลและใช้การถ่ายโอนแบบ peer-to-peer เพื่อให้โฟลเดอร์ที่เลือกซิงค์กันระหว่างเครื่องหรืออุปกรณ์ใด ๆ ที่คุณติดตั้งแอปพลิเคชัน อาจเป็นกรณีง่าย ๆ ในการเลือก~/Libraryโฟลเดอร์หรือ~/Library/Saved Application Stateโฟลเดอร์ที่จะตรวจสอบและซิงค์ในเวลาจริง โฟลเดอร์สามารถคงอยู่ได้และถ้าคุณเลือกชำระเงินสำหรับคุณสมบัติเพิ่มเติม (ชำระครั้งเดียว) คุณสามารถเลือกซิงค์ไฟล์แต่ละไฟล์ภายในโฟลเดอร์และเข้ารหัสเพื่อความปลอดภัยของข้อมูล ฉันแนะนำแอปพลิเคชันนี้จริง ๆ และดูเหมือนว่าเหมาะสำหรับสถานการณ์เฉพาะนี้

การเขียนสคริปต์

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

การดึงรายการแอปพลิเคชันที่ทำงานอยู่

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

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

    tell application "System Events" to set OpenApps to the ¬
        name of every application process whose ¬
        class of its menu bar contains menu bar and ¬
        POSIX path of the application file does not start with "/System" and ¬
        POSIX path of the application file does not start with "/Library"

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

วิธี Bash ในการรับรายการแอปพลิเคชั่นที่รันอยู่คือ:

    IFS=$'\r\n'; basename $( \
    egrep -i -e '^/Applications/.*\.app/Contents/MacOS/[^/]+$' \
    <<<"$(ps -U 501 -o 'comm')" ) | sort -u

มันรวดเร็ว (ทันที) แต่พลาดสองแถบเมนูและแอปพลิเคชั่นพื้นหลัง

ฉันคิดว่าวิธีการใดวิธีหนึ่งในท้ายที่สุดจะใช้ได้กับสิ่งที่ต้องการเนื่องจากแอปพลิเคชันที่สำคัญที่สุดในการจับภาพคือแอปพลิเคชันที่คุณโต้ตอบด้วยเบื้องหน้าและวิธีการเหล่านั้นส่วนใหญ่

จัดเก็บข้อมูลในไฟล์การตั้งค่าที่ใช้ร่วมกัน

การเขียนการตั้งค่าที่ต้องบันทึกสามารถทำได้กับ.plistไฟล์ซึ่งเก็บคู่ของคีย์ / ค่าของข้อมูลพร้อมกับชนิดข้อมูล สิ่งนี้อนุญาตให้บันทึกและเรียกคืนค่าใด ๆ ด้วยชื่อ พวกเขายังค่อนข้างเพียงแค่การอ่านและแก้ไขโปรแกรมโดยใช้ AppleScript plutilหรืออรรถประโยชน์บรรทัดคำสั่ง

สมมติว่าไฟล์การตั้งค่าที่ใช้ร่วมกันจะได้รับการบันทึกใน~/Example/savedState.plistกรณีที่~/Example/มีโฟลเดอร์แชร์บางประเภท (เช่นโฟลเดอร์ที่เก็บข้อมูลบนคลาวด์) ซึ่งคอมพิวเตอร์ทั้งสองเครื่องสามารถเข้าถึงได้

การใช้ AppleScript นี่เป็นวิธีที่คนหนึ่งอาจบันทึกรายการแอปพลิเคชันที่เปิดอยู่ในปัจจุบัน:

    property plist : "~/Example/SavedState.plist"

    tell application "System Events"
        if not (the file plist exists) then make new property list file ¬
            with properties {name:plist}

        set plistf to the property list file named plist

        tell plistf to make new property list item with properties ¬
            {name:"OpenApps", kind:list, value:OpenApps}
    end tell

โดยที่ตัวแปรOpenAppsนั้นนำมาจากข้อมูลโค้ด AppleScript ด้านบน อย่างชาญฉลาดmake new property listคำสั่งจะเขียนทับรายการคีย์ / ค่าที่มีอยู่ที่มีชื่ออยู่"OpenApps"แล้วดังนั้นมันจะไม่ซ้ำกัน

ต่อไปเราต้องการวิธีออกจากแอปพลิเคชันบนระบบ:

    to kill(A as list, X as list)
        local A, X

        if A = {} then return

        script jury
            property A0 : item 1 of A
            property An : rest of A
            property OK : A0 is not in X
        end script

        tell the jury
            ignoring application responses
                if its OK then quit the application named (its A0)
                kill(its An, X)
            end ignoring
        end tell
    end kill

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

เปิดเอกสารอีกครั้ง

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

อย่างไรก็ตามมันอาจเป็นการเก็บรายชื่อของเอกสารที่เราสามารถตรวจจับได้


[หมายเหตุสำหรับฉันที่จะรวมเข้าไปในคำตอบ]

  • ฉันสังเกตเห็นว่า.savedStateไฟล์บางไฟล์ถูกจัดเก็บใน~/Library/Saved Application State นามแฝง (ลิงก์สัญลักษณ์) แทนที่จะเป็นไฟล์จริง เหล่านี้มักจะเชื่อมโยงไปยัง~/Library/Containers/%bundle-id%/Data/Library/Saved Application State/%file%สถานที่ที่%bundle-id%เป็นตัวอย่างเช่น, com.apple.Previewและของที่สอดคล้องกันคือ%file%com.apple.Preview.savedState

ซึ่งหมายความว่า~/Library/Containersจะต้องมีการซิงโครไนซ์ระหว่างเครื่องสองเครื่องเช่นกัน

  • .savedStateไฟล์จะถูกลบเมื่อใดก็ตามที่แอปพลิเคชันออกจากระบบอย่างหมดจด ดังนั้นโปรดทราบว่าการปิดแอปพลิเคชันในระบบหนึ่งจะลบไฟล์ข้อมูลเหล่านั้นจากนั้นอาจซิงโครไนซ์การลบเหล่านี้กับเครื่องอื่น

1

ก่อนหน้านี้ (ก่อนหน้า Sierra) คุณอาจมี Portable Home Directories เก็บไว้ในเครือข่ายที่อนุญาตให้ใช้งานเครื่องหลายเครื่องได้อย่างง่ายดายด้วยโปรไฟล์ผู้ใช้เดียวกัน แน่นอนว่ามันทำงานได้ดีที่สุดสำหรับโปรไฟล์ผู้ใช้ที่ไม่มีข้อมูลหลายร้อยกิกะไบต์ ประสิทธิภาพของวิธีการนี้ผ่าน LAN แบบมีสายนั้นดีมากบางแห่งที่ฉันทำงานที่นี่ใช้เพื่อเปิดใช้งานการจัดโต๊ะร้อน

สิ่งเดียวที่ยังคงรองรับเช่นนี้คือบัญชีมือถือ https://support.apple.com/kb/ph25671

หรือคุณสามารถใช้ iCloud ไดรฟ์เพื่อซิงค์~/Desktopและ~/Documents, และโฟลเดอร์เพิ่มเติมใด ๆ ที่คุณต้องการ

หรือคุณอาจต้องการดูว่ามีโฟลเดอร์ Home ของคุณเก็บไว้ในระบบคลาวด์โดยใช้csync , Dropbox หรืออะไรก็ตาม https://www.amsys.co.uk/using-cloud-storage-sync-home-folder-macs/

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


1
สามารถทำงานได้ ฉันต้องการหลีกเลี่ยงอย่างใดอย่างหนึ่งในเวลาเดียวกันถ้าเป็นไปได้ แต่ฉันอาจจะไม่ "ใช้" ทั้งสองในเวลาเดียวกันดังนั้นฉันเดาแบบเรียลไทม์ไม่ใช่สิ่งที่ฉันขอ ... ขอบคุณ
ajf-

ดังนั้นสิ่งนี้จะถูกนำมาใช้เพื่อ "คืนค่า" (โอน) สถานะของแต่ละแอปพลิเคชันบนเครื่องหนึ่งไปยังอีกกระจกหนึ่งได้อย่างไร โดยเฉพาะหน้าต่างจะเปิดขนาดและตำแหน่งและวิธีการโหลดเอกสารอย่างเหมาะสมได้อย่างไร
CJK

สหรัฐฯที่บันทึกไว้ควรทำเช่นนั้น
Matt Sephton

ไม่ใช่โดยการแทนที่.savedstateไฟล์ การแทนที่จะไม่ทำให้หน้าต่างล้าสมัยปิดหน้าต่างใหม่เพื่อเปิดหรือปรับขนาด / เปลี่ยนตำแหน่งเอกสารที่จะโหลด ... บางสิ่งจำเป็นต้องเกิดขึ้นเพื่อบังคับให้แอปพลิเคชันใช้.savedstateข้อมูลใหม่นี้และดำเนินการกับมัน (PS. โปรดติดแท็กฉันหากคุณตอบกลับดังนั้นฉันจึงได้รับการแจ้งเตือน)
CJK

1
@ ajf- ฉันเห็น มันจะเป็นประโยชน์หากได้ทราบข้อมูลเฉพาะก่อนหน้านี้ ฉันไม่ตอบคำถามเพราะฉันอยู่ในอุปสรรค์เกี่ยวกับวิธีการกู้คืนหน้าต่างตำแหน่ง ฯลฯ มีเพียง 18 ชั่วโมงที่เหลือในค่าหัวนี้ดังนั้นฉันสงสัยว่าฉันจะได้รับทันเวลา แต่มันทำให้ปัญหาค่อนข้างง่ายขึ้น หากคุณมีเวลาบางทีคุณอาจจะปรับเปลี่ยนคำถามของคุณจะรวมเฉพาะสิ่งที่คุณไม่จำเป็นต้องใช้เมื่อเทียบกับสิ่งที่คุณทำไม่ได้; และแอปพลิเคชันที่เกี่ยวข้องซึ่งจะส่งผลต่อวิธีการลงทะเบียนเอกสารโดยสคริปต์
CJK
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.