ターミナルで起動したアプリケーションが不要に終了するのを防ぐ方法は?


10

次のようなコマンドを使用して、ターミナルからアプリケーションを起動します。

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

重要な部分は  &

  • Unix / Linux / Solarisの場合:

    • 学校で学んだこと&は、プログラムを追加することで自分でプログラムを実行できること  です。
    • xeyes &シェルを閉じた後でも、次のようなコマンドを起動してプログラムを安全に実行することを強く覚え  ています。
  • Mac OS X(Unix内部):

    1. でアプリを起動し  &、ターミナルウィンドウを閉じます。アプリケーションが終了します。
    2. この望ましくない動作がMac OS Xで発生するのはなぜですか?
    3. これはどのように修正できますか?

回答:


7

(OS XおよびLinux、FreeBSD、または他のシステムで)達成したいことを達成する「標準的な」方法は、次のコマンドを使用することnohupです。

nohup program &

これが開始しますprogram。これは&-のためにシェルに対してバックグラウンドで実行され、nohupコマンドによるハングアップ信号を無視します。

この方法では、シェルを閉じてもプログラムは実行され続けます。Terminal.appを閉じているためにシェルを閉じている場合でも、コンピューターへのssh接続から切断しているためにシェルを閉じている場合でも、同様の問題はありません。


1
これによりnohup.out、現在のフォルダーにファイルが作成されます。書くものが何もないときでさえ。数週間後nohup.out、Macのどこにでもファイルができました。:-(
ニコラスバルブレスコ14年

1
@NicolasBarbulesco nohup command>/dev/null&またはのいずれかを使用しますcommand&disown
LRI

6

端末ウィンドウを閉じると、SIGHUP(ハングアップ信号)がシェルに送信され、シェルは起動したすべてのプロセスにSIGHUPを送信します。これはbashや他の多くのシェルの従来の動作であり、これに対する従来の解決策はnohupを使用することです。

さまざまなUnixマシンが異なる場合があるため、使用した特定のターミナルエミュレータまたは使用した特定のシェルが異なる動作をする可能性があります。しかし、それはOS Xに固有のものではありません。 たとえば、Ubuntuでのこの同じ問題に関する質問があります。


6

アンパサンド「&」を使用して、ターミナルにシェル自体のバックグラウンドでプロセスを実行するように指示しています。したがって、シェルを閉じる(およびプロセスを強制終了する)と、GUI(Mail.app自体)も閉じます。

端末からメールを起動する正しいコマンドは次のとおりです。

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 &
ニコラスバルブレスコ14年

2
@NicolasBarbulescoそれは別の質問です- オープンのマニュアルページを参照してください、私はここで質問を考える
マーク

ではなく/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 &
ニコラスバルブレスコ14

@NicolasBarbulesco open [full path]、またはcdでディレクトリに移動して[file]を開きます。〜/ De * / Fire * ... et ceteraなど、他の文字列が値に一致しないことを前提とした短い表記として、ホームフォルダーと特殊文字「アスタリスク」に〜/を使用できます。または、単純なスクリプトを書くだけです:cat> nameofscript .....#!/ bin / sh .... open [full path] .... ^ D ..... chmod + x nameofscript .....。\ nameofscript ....およびオプションで、mv nameofscript $ PATH / yourpersonalbin。読書をする人を開くことをお勧めします。これは単純なコマンドであり、単純なコマンドとしてのトレードオフはそれほど強力ではありません。
njboot 14

1
申し訳ありませんが、まだ-a引数を使用する必要があります:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot

3

@jksoegaardには適切なコマンドがありますが、コメントで述べたように、nohup.outファイルを作成します。nohup.outファイルの作成を停止するには、STDOUTおよびSTDERRを別の場所にリダイレクトする必要があります。完全なコマンドはになりますnohup program &>/dev/null &。これにより、プログラムがバックグラウンドで実行され、SIGHUPは無視され、すべてのSTDOUTとSTDERRが/ dev / nullに送信されます。

ただし、nohupを追加することを覚えていない場合(元の質問のように)、disown -arhコマンドを使用して、バックグラウンドで実行されているすべてのジョブをマークし、SIGHUPを無視できます。


いい答えですが、まだ複雑です。素敵なプロフィール画像。:
ニコラスバルブレスコ14

3

私は解決策を見つけました:

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

シンプルで、きれいで、機能します!

括弧は  ( )サブシェルでコマンドを起動します。


-そして、&は待機せずにプログラムからシェルに戻ります。したがって、シェルを使用し続けるか、終了したプログラムを終了せずにシェルを終了できます。
r_alex_hall

0

または、試すことができます open -a /Applications/Mail.app

使用法:open [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [-b] [-a] [ファイル名] [-引数引数]
ヘルプ:Openは、シェルからファイルを開きます。
      デフォルトでは、そのファイルのデフォルトのアプリケーションを使用して各ファイルを開きます。
      ファイルがURL形式の場合、ファイルはURLとして開かれます。
オプション:
      -a指定されたアプリケーションで開きます。
      -b指定されたアプリケーションバンドル識別子で開きます。
      -e TextEditで開きます。
      -tデフォルトのテキストエディタで開きます。
      -f標準入力から入力を読み取り、TextEditで開きます。
      -F --freshアプリを新しく起動します。つまり、ウィンドウを復元しません。保存された永続状態は、無題ドキュメントを除き失われます。
      -R、-reveal開くのではなく、Finderで選択します。
      -W、--wait-apps使用中のアプリケーションが終了するまでブロックします(既に実行されていたとしても)。
          --args残りのすべての引数は、開かれる代わりに、argvでアプリケーションのmain()関数に渡されます。
      -n、-new既に実行されている場合でも、アプリケーションの新しいインスタンスを開きます。
      -j、-hide非表示のアプリを起動します。
      -g、--backgroundアプリケーションを前面に表示しません。
      -h、-header指定されたファイル名に一致するヘッダーのヘッダーファイルの場所を検索し、それらを開きます。
      -s -hの場合、使用するSDK。指定した場合、名前に引数値が含まれるSDKのみが検索されます。
                        それ以外の場合、各プラットフォームで最高バージョンのSDKが使用されます。

-2

私は解決策を見つけました:悪と悪との戦い。

この種のコマンドでアプリを起動します:

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

シェルはすぐに終了します。そして、ターミナルウィンドウを閉じた後でも、アプリは存続します。

しかし、この解決策はあまり便利ではありません。


1
本当にopenにバンドルされているアプリケーションを開く必要があります。バンドルの内容が標準的なものと同様に変化するので、それは将来の証拠です。
イアンC.

@Ian —ここでは/Applications、Mac ではなく、特定のパスにあるアプリケーションを開くことに特に興味があります。
ニコラスバルブレスコ14

1
.appフォルダは「バンドル」と呼ばれ、openコマンドはそれらが/Applicationsフォルダにあるか他のフォルダにあるかにかかわらずそれらを起動できます。このコンテキストでの「バンドル」という用語は、「OS Xに同梱されている」という意味ではありません。
アンドリューメディコ14

openは、アイコンをクリックするのと同じです。OPが要求するように、コマンドラインからアプリを起動することとは異なります。
テッドビガム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.