バックグラウンドでBashスクリプトを実行し、ターミナルを終了します


19

コマンドまたはBashスクリプトの終了ターミナルを起動して、コマンドを中断することはできますか?

私の解決策は、特定の時刻にcronを実行することでしたが、もっと簡単なものがあると確信しています。


回答:


45

端末およびシェルの子プロセスに伝播する終了シグナルを回避するには、コマンドを次のように実行しますnohup

nohup cmd &

1
これは正解です。nohupがなければ、開始されたプロセスは端末プロセスの「子」とみなされ、端末が閉じられると終了します。
イジー

3
cmd & disown&は、;コマンド区切り記号のように扱われるため、機能します。disownコマンドは、bashシェルセッションとバックグラウンドコマンドの間の接続を削除します。
lornix

2
zshにはこれを短縮したものがありますcmd &|
トール

これが機能するためには、Terminal.appの設定を変更する必要がありました。[プロファイル]でアクティブなプロファイルを選択し、[シェル]、[シェルが終了したとき]、[シェルが
正常に

6

を使用してscreen

screen -S <session name> -d -m <your command>

その後、端末を終了できます。また、次の方法で端末に再接続できます。

screen -r <session name>

詳細:参照


4

ターミナルを終了した後、バックグラウンドで特定のコマンドまたはファイルを毎秒程度実行したい場合は、この簡単なことを試してみてください。

nohup watch -n5 'bash script.sh' &

それは5秒ごとにscipt.shを実行します。


1
「nohup」はすでに受け入れられた回答でカバーされています。そして、定期的に実行するのではなく、「このコマンドを数秒後に実行する」と言って使用しているため、askerがcronに言及していると確信しています。
デビッドリチャービー

1
私の答えは事態を悪化させない。反対票のポイントを参照してください。ニューラルで十分です。
ジャミテリン

3

コマンドの後に「&」文字を置きます。

例えば:

/home/your/script.sh &

7
この場合、端末が閉じられると、プロセスも開始さ/home/your/script.shれます。「親」から切り離されたのではなく、単に「バックグラウンド」になったためです。nohup実際にそれをデタッチするために使用します。
イジー

悪いこと、私はそれを知りませんでしたが、Debianでテストしたとき、それを起動したシェルを閉じた後にコマンドが実行し続けました:/
Flinth

1
バックグラウンドプロセスが正確にどこにいつ接続されているのかわかりません。ただし、たとえばリモートマシンにログインする場合、ログアウトするとすぐに停止します(デーモン化されいる場合を除く)。100%確実にするために、むしろnohup-を使用しますnohup.out。これは、コマンドを開始したディレクトリにあるというファイルにすべての(現在は非表示の)出力を記録します。
イジー

さて、説明をありがとうございます^^
Flinth

この回答は、jobsコマンドと組み合わせると正常に機能する場合があります。シェルプロセスをバックグラウンド化した後、シェルプロセスに戻れるようにしたいことがよくあります。
djangofan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.