73037


tera termでssh接続でGPUサーバ（仮想環境）にアクセスして処理をしています。以下を行いたいのですが、良い方法はないでしょうか。

### 行いたいこと

[code]

    $ bash                                          # (1)
    username@user:~$ source venv/bin/activate       # (2)
    (venv) username@user: ~$ python3 my_script1.py  # (3)
    
[/code]

と処理を行っている途中で

[code]

    python3 my_script2.py
    
[/code]

という処理も同じセッション内で行いたいです。  
基本的には`python3 my_script1.py`が終わった後に`python3
my_script2.py`を実行すれば良いと思うのですが、`my_script1.py`も`my_script2.py`も時間がかかる処理なので、できれば`my_script1.py`の処理を開始して、上手く動いていそうなことがわかったら`my_script2.py`を開始したいです。  
同じセッションで行いたい理由は、新たなセッションを作成すると、別セッションでのコマンド入力の履歴は`↑`ボタンで見られないためです。どのセッションからも全履歴を↑ボタンで閲覧できるようにしたいためです。tera
termを使用している理由は、GUIが使いやすいというくらいで特にありませんので、ターミナルアプリ変更で実現できるのであれば、そちらも検討したいと思います。

### 試してみたこと

[code]

    nohup python3 my_script1.py
    
[/code]

とすればセッションを終了しても`my_script1.py`を継続できますが、同じセッション内で新たに処理を実行しようとして`python3
my_script2.py`というコマンドを入力するには、`Ctrl+C`等で一度

[code]

    (venv) username@user: ~$
    
[/code]

のコマンド入力画面に戻らなければなりません。  
しかし`Ctrl+C`をすると、nohup処理をしていても`nohup python3 my_script1.py`が中断されてしまいます。


CC BY-SA 4.0
2021-01-03T03:22:05.557
73035
2021-01-03T06:51:16.587
2021-01-03T06:51:16.587
3060
30785
question
linux
同じセッション内で複数処理を行いたい


シェルのジョブ管理の機能を使えば良いと思います。  
具体的には次のような操作になります。

`python3 my_script1.py` で起動するとフォアグランドで処理が起動します。  
その状態で`CTRL+Z`を押してフォアグランドの処理を中断状態にし、`bg`コマンドでバックグランドで処理を再開させます。

そうすればシェルのコマンド待ちとなるため、そこで `python3 my_script2.py`を実行させることができます。

以下、より一般化した説明をします。

シェルのコマンド待ち状態でコマンドを起動すると通常はフォアグランドで起動します。

[code]

    $ foo-command
    
[/code]

コマンドの末尾に`&`をつけるとバックグランドで起動します。

[code]

    $ bar-command &
    
[/code]

実行中のジョブは、

[code]

    $ jobs
    
[/code]

で確認できます。ジョブの左にある数字がジョブ番号です。`%`(ジョブ番号)で指定したジョブをフォアグランド/バックグランドで起動させることができます。(ただし現在フォアグランドでジョブが実行されている場合はコマンドを実行させることができないので、あらかじめ`CTRL-Z`でフォアグランドのジョブを停止させてコマンド待ちの状態にする必要があります。)

[code]

    $ fg %1 
    
[/code]

[code]

    $ bg %1
    
[/code]


CC BY-SA 4.0
2021-01-03T04:08:12.780
73037
2021-01-03T04:08:12.780
30745
73035
answer


> 基本的には`python3 my_script1.py`が終わった後に`python3 my_script2.py`を実行すれば良い

であれば、`;` か `&&` でコマンドを連結すれば良いでしょう。

[code]

    (venv) username@user: ~$ python3 my_script1.py; python3 my_script2.py
    
[/code]

[code]

    (venv) username@user: ~$ python3 my_script1.py && python3 my_script2.py
    
[/code]

`;` は左のコマンドが終了したら右のコマンドを実行します。`&&` は左のコマンドが終了コード0で終了したら右のコマンドを実行します。


CC BY-SA 4.0
2021-01-03T04:26:11.600
73038
2021-01-03T04:26:11.600
3475
73035
answer