注:まだ回答中です...
アプリケーションの実行状態を同期するスクリプトの詳細を記述するためのもう1つの節私は最初にこれらのスクリプトを書かなければなりません。
目的
大まかに言って、2つのMacがアプリケーションの状態やプロパティ、ロードされたドキュメント、アクティブに実行されているアプリケーションなど、ユーザー環境に関する情報を保存および共有する手段を考案する 。
あなたの最初の要求は あるマシンから別のマシンへシームレスに移動し、前のアプリケーションで開いていたアプリケーションの状態をコマンドで再現します。 あなたはそれ以来あなたの期待を少し緩和し、そして「ホットリロード」アプリケーションが求められていないこと、そしてウィンドウのサイズや位置のような細目は問題ではないことを明らかにしました。
概念的な方法論
1. 2つのスクリプトと1つの共有データファイル
私の最初のアイデアは、アプリケーション環境に関する情報を取得し、それを両方のマシンがアクセスできる共有ファイルに保存することを担当するハンドラを持つスクリプト(おそらくAppleScript)を各マシンにコピーすることでした。経由 ドロップボックス 、 iCloud ……)スクリプトには、この共有ファイルの内容を取得して設定をローカル環境に適用するための個別のハンドラがあります。これは、設定を適用するためにユーザーがマシンに到着したときに一度スクリプトを実行することを要求します。また、新しい設定で共有データファイルを更新するためにマシンを離れる直前に一度。
2。 .savedState
同期
私の2番目の考えは、次の場所にあるファイルを同期するという他の人の概念からヒントを得たものです。 ~/Library/Preferences/ByHost/com.apple.loginwindow.*
。そうしても意味がありませんが、同期するかどうかという問題が生じます。 .savedState
フォルダ内のファイル ~/Library/Saved Application State
解決策だろう。
確かに、2つの異なるシステム間でこれらのファイルを同期しようとすることによる完全な悪影響が何かを知ることはできません。それは悪いことが起こると言うことではありませんが、それは未知の領域なので、望ましくない結果の可能性があります。しかし、私の考えでは、それが大体において安全であり、恐らく全く無害であるということです。 .savedState
解決策は、ファイルを削除することです。 .savedState
ファイルを作成し、問題のアプリケーションが新しいファイルを生成できるようにします。
私はこれら二つの方法の組み合わせが必要になると思う。
同期中
を同期しています ~/
Dropbox経由のフォルダ
ホームフォルダを同期しても、各マシンでドキュメントを利用できるようにするための手段しか提供されていない可能性がありますが、おそらく同期することはできません ~/Library
場所を変更できない場合は、フォルダまた、このフォルダのサイズは私のシステムでは26GBなので、追加のクラウドストレージスペースの購読料を支払う必要があります。
最終的に、ホームフォルダの同期がに限定されている場合 Downloads
、 Documents
、 Music
、そして Movies
、それを持っていることよりも多くの利益ではありません Documents
そして Desktop
フォルダを同期しました iCloud 。
ただし、両方のコンピューター上の同じファイルにアクセスし、一方の変更をもう一方のコンピューターに反映させることが重要になるため、文書を同期させることは重要です。 iCloud 非常に遅いですが、この仕事には問題ありません。
を同期しています ~/Library
フォルダ
の ~/Library
フォルダ、または少なくともその特定のサブフォルダは、 .savedState
システム間でアプリケーションの状態をマッピングするためのファイル。ホームクラウドストレージソリューションはこのタスクには理想的です。サブスクリプション料はかかりません。あなたの機密データはあなたの所持品としては安全であり、 ドロップボックス または 林檎 ;インターネットを介して同期している場合は、ISPによって課される速度以外に速度調整はありません。
私はすでに使っています Resilio Sync これは、個人使用は無料で、ピアツーピア転送を使用して、アプリケーションをインストールした任意のマシンまたはデバイス間で選択したフォルダを同期させることができます。それを選択するのは簡単な場合です ~/Library
フォルダまたは ~/Library/Saved Application State
フォルダを監視してリアルタイムで同期します。フォルダはそのままにしておくことができます。追加機能の支払いをする場合(一括払い)、フォルダ内の個々のファイルを選択的に同期し、データセキュリティのためにそれらを暗号化できます。私は本当にこのアプリケーションをお勧めします、そしてそれはこの特定の状況にとって理想的なようです。
スクリプティング
同期している場合 .savedState
ファイルが成功した場合、他のマシンで実行されていたアプリケーションを開く(または開く)ためのスクリプトが必要になるかもしれません。再オープンすることで、アプリケーションに最新の情報を読み取らせることができます。 .savedState
ファイルを作成し、他のシステムでの状態を複製します。これは部分的に成功すると思いますが、おそらく全部ではないでしょう。
実行中のアプリケーションのリストを取得する
アプリケーションが実行されているかどうかをテストするにはさまざまな方法があり、完璧なテストはないため、これは実際よりも複雑です。ウィンドウに表示されるアプリケーションはフォアグラウンドにあります。バックグラウンドプロセスとして実行されている、メニューバーアプリケーション、ウィンドウのないものもあります。また、ドックに隠されたアプリケーションが最小化され、表示ウィンドウが表示されないこともあります。
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
高速です(瞬時)が、メニューバーやバックグラウンドアプリケーションがいくつか欠けています。
キャプチャする最も重要なアプリケーションはフォアグラウンドで対話しているものであり、それらはほとんどのメソッドで捕捉されるため、どちらの方法でも最終的には必要なものに適していると思います。
共有設定ファイルに情報を保存する
保存する必要がある設定を書くことはaにすることができます .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
)それはそれからリストを一つずつ調べ、適用がのものの1つでないことを点検 X
それをやめてリストの残りに移動する前に。
文書を再度開く
同期の使用を採用することによって .savedState
1つのシステム上のアプリケーションが一度初期化されると(それを閉じて再び開くなどして)、もう一方のシステムで開かれていた文書が再び開かれることを望みます。
しかし、私たちが知ることができる(私たちの能力の範囲で)オープンでアクティブなドキュメントの私たち自身のリストを保存することが賢明であるかもしれません。
[解答に統合するための私への注意]
- 私はそのいくつかに気づいた
.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
2台のマシン間でも同期する必要があります。
.savedState
アプリケーションが正常に終了するたびにファイルは削除されます。したがって、1つのシステム上でアプリケーションを閉じると、それらのデータファイルが削除され、それらの削除が他のマシンと同期される可能性があります。