3

切り離された状態でセッションを開始screenして、スクリプトが終了するscreen終了し、手動で 1 つずつ各セッションを開始してから切り離すことなく、複数のセッションを実行するスクリプトを記述できるようにしたいと考えています。次の画面セッションへ。

このスクリプトは、設定されている特定の環境変数に依存します。通常、このスクリプトを 以外のscreen通常bashのシェルで実行する場合は、これらの環境変数を.bash_profileファイルに設定するだけです。

.screenrcさらに、切り離されていない状態で画面を起動し、ファイルに入れると:

shell -$SHELL

それから私も問題ありません。

この問題は、実行したときにのみ発生しscreen -dm、必要な環境が設定されていないため、スクリプトの実行に失敗します。

.screenrc切り離された状態で起動するときにファイルを参照するように画面に指示するにはどうすればよい.bash_profileですか?

アップデート

実行するscreen -dmL envと、環境変数のすべてではなく一部が存在することがわかります。

4

2 に答える 2

3

あなたの問題はscreen、切り離されたモードでscreen起動すると、ログインシェルまたはインタラクティブシェルが起動しないため、ソースが取得されないことだと思います(起動時にどのファイルがソースされるかについての説明については.bash_profile、の「INVOCATION」セクションを参照してください) man bash. あなたの先頭-にあることに注意してください

shell -$SHELL

設定は、シェルが常にログイン シェルとして開始されることを意味し、そのため、.bash_profileソースされます。

あなたの問題に対するいくつかの可能な解決策:

  1. screen切り離した状態で起動しないでください。screenスクリプトがコマンドとして与えられた場合、通常の方法で開始された場合、スクリプトが終了すると終了することに注意してください。たとえば、スクリプトの場合test.sh:

    #!/bin/bash
    
    for n in `seq 1 5`; do
      echo $n
      sleep 1
    done
    

    実行screen ./test.shするとスクリプトが実行され、5 秒後に終了します。

  2. .bash_profile画面で実行しているスクリプトを手動でソースします。すなわち追加

    source ~/.bash_profile
    

    スクリプトの先頭に、MyScript.

更新 1

問題はあなたがロードされていないことだと私はまだ思っているので、あなた.bash_profileロードされていることを確認しましょう。追加してみる.screenrc

screen touch /tmp/when-was-screen-rc-sourced

あなたの最後~/.screenrcまで

screen MyScript

その後

ls -lt --full-time /tmp

いくつかの異なる方法で画面を起動してみて、~/.screenrc本当に読み込みに失敗しているかどうかを確認してください。

同様に、行を追加できます

touch /tmp/when-was-bash-profile-sourced

~/.bash_profileそれがいつロードされるかを確認するためにあなたの最後まで。

更新 2

screenこれは、次の行があるときにスクリプトを実行することを示す例です

screen touch /tmp/when-was-screen-rc-sourced

あなたの最後に~/.screenrc

テストファイルは次のtest.shとおりです。

#!/bin/bash

touch /tmp/when-did-test-sh-start
for n in `seq 1 5`; do
  echo $n
  sleep 1
done
touch /tmp/when-did-test-sh-finish

これが証拠です。ランニング

$ touch /tmp/when-did-we-start; screen -d -m ./test.sh; sleep 6; ls -ltr --full-time /tmp | tail -n4

出力を与える

-rw------- 1 collins collins    0 2013-11-06 14:43:03.643564802 -0800 when-did-we-start
-rw------- 1 collins collins    0 2013-11-06 14:43:03.659565385 -0800 when-was-screen-rc-sourced
-rw------- 1 collins collins    0 2013-11-06 14:43:03.671565892 -0800 when-did-test-sh-start
-rw------- 1 collins collins    0 2013-11-06 14:43:08.707770194 -0800 when-did-test-sh-finish

したがって、問題はあなた~/.bash_profile(または不足している環境変数を定義するもの)がロードされていないことに関連していると思います。

アップデート 3

この時点で、達成しようとしていることを正確に理解し、それを行うためのより良い方法を考え出す方が簡単かもしれません. screen ./example.shこれを行うには、問題を説明する最小限のサンプル スクリプトを提供すると役立ちます (つまり、直接実行するか、画面の起動後に手動で実行すると機能しますが、またはを介し​​て直接実行すると機能しませんscreen -d -m ./example.sh)。

しかし、それまでの間、別の潜在的な回避策があります (上記の 2 番目の元の提案を試したことがあり ~/.bash_profileますか?スクリプトで直接ソースを取得するだけです?):

スクリプトを bash で実行し、明示的に bash をインタラクティブにして、および/またはログイン シェルを作成します。たとえば、インタラクティブなログイン シェルの場合は、次のようにします。

screen -d -m bash -i -I ./MyScript

bash がどのモードでどのファイルをロードするかについては、こちらを参照 してください。によるとman bash、このbash -i -I組み合わせにより、bash が対話型ログイン モードでスクリプトを実行するように~/.bash_profileなるため、ソースを取得する必要があります。

于 2013-11-05T22:00:48.420 に答える
2

~/.screenrc は必要ありません
~/.bash_profile を 1 行にします:source ~/.bashrc
エイリアスと環境変数を ~/.bashrc に入れます

~/.bashrc に、次のようなコードを記述します。

alias myalias="echo ThisWorks"

run_myalias_in_bg_screen (){
    screen -dmS mytestscreen bash -c 'exec bash'
    screen -r mytestscreen -p0 -X stuff "myalias"
    screen -r mytestscreen -p0 -X eval "stuff \015"
}

ターミナルでテストしてみましょう

$ run_myalias_in_bg_screen
$ screen -r mytestscreen
于 2016-11-17T20:44:54.283 に答える