web-dev-qa-db-ja.com

ターミナルを閉じた後、バックグラウンドでプロセスを実行しています

ターミナルを閉じた後でも、バックグラウンドでスクリプトを実行しようとしています。 Nohupdisownを検索して試しましたが、どちらも機能していないようです。ターミナルウィンドウを閉じると、典型的なClosing this window will terminate the running processes: watch.メッセージが表示されます。 Nohupまたはdisownを使用している場合でも、バックグラウンドプロセスが終了します。何が問題なのですか?

私のコードは単純な2行です

cmd="Nohup watch -n 1 Sudo /etc/block.sh > /dev/null"
$cmd & # blocks automatically  

新しい端末を開くたびに起動したいので、.bash_profileにあります。

Sudoは無視してかまいません。パスワードを入力せずにSudoコマンドを実行する方法をすでに見つけました。

MacOSXを使用しています。

10
John Robins

サブシェルを開始し、そこからNohupコマンドを実行すると、終了時にターミナルがサブシェルを強制終了することを回避できるようです。

bash -c "Nohup sh -c 'while true; do date; sleep 1; done' &"

あまりエレガントではありませんが、私にとってはうまくいきます。

15
tripleee

これはすでに回答済みですが、Screenユーティリティはこれに最適のようです。

  • man screen画面のドキュメントを表示します。

  • www.ss64.com/osx/screen.htmlは、もう少しユーザーフレンドリーなドキュメントを表示します。

  • 名前と実行するスクリプトを使用して画面を開始します。

    screen -S GWatch Scripts/gw_watch.sh
    This starts a screen session named 'GWatch' and executes gw_watch.sh.
    

スクリーンセッションが開始されると、それから切断するオプションがあります。これにより、画面がバックグラウンドでアクティブなままになります。ユーザーがログアウトした後もアクティブなままになります(許可にかかわらず)。

次に例を示します。

  1. 'screencheck.sh'というシェルスクリプトを作成します
  2. 以下をファイルに入れます(私はしばしばtextwranglerおよび/またはnanoを使用します)。

    #!/bin/bash
    
    count=0
    
    while [ $count -lt $1 ] ; do 
       echo "Count: $count of $1. Pausing for five seconds."
       sleep 5s
       ((count++))
    done
    
  3. 2つのターミナルウィンドウを開きます。

  4. ターミナルウィンドウの1つで、screen -lsと入力します。ソケットが見つからないというメッセージが表示されます。
  5. 2番目のターミナルウィンドウで、ディレクトリをスクリプトが保存された場所に変更します。
  6. 2番目のターミナルウィンドウでscreen -S ScreenCheck screencheck.sh 500と入力します。 screencheck.shは実行可能である必要があります。
  7. 2番目のターミナルウィンドウに、次のように表示されます。

    Count: 0 of 500. Pausing for five seconds.
    Count: 1 of 500. Pausing for five seconds.
    Count: 2 of 500. Pausing for five seconds.
    ...
    
  8. ctrl-a dと入力して、画面セッションから切断します。それはコントロール+ a、両方を離す、dキーです。
  9. [detached]が表示されます。
  10. 最初のターミナルで、screen -lsと入力します。
  11. 次のようなものが表示されます。

    FCH000: ~: screen -ls
    There is a screen on:
       1593.ScreenCheck (Detached)
    1 Socket in /var/folders/pk/l6b5fhkj6mxfpfh8mtgmstg40000gn/T/.screen.
    
  12. screen -R ScreenCheckを使用して画面セッションに再接続します。

  13. 次のようなものが表示されます。

    Count: 226 of 500. Pausing for five seconds.
    Count: 227 of 500. Pausing for five seconds.
    Count: 228 of 500. Pausing for five seconds.
    Count: 229 of 500. Pausing for five seconds.
    ...
    

ログアウト後に実行されているかどうかを確認するには、ログアウトして、別のコンピューターからコンピューターにSSH接続します。 screen -lsは、以前と同じ画面セッションを表示する必要があります。

これがお役に立てば幸いです。

7
Thoth