基本端末をブロックせずにプロセスが終了するのを待ってから、一連のタスク(tmuxセッションの終了など)を実行するにはどうすればよいですか?

基本端末をブロックせずにプロセスが終了するのを待ってから、一連のタスク(tmuxセッションの終了など)を実行するにはどうすればよいですか?

tmux内でnohupを「再実装」しようとしています(したがって、私をブロックせずにタスクを渡してから、nohupとして機能するtmuxコマンドを終了します)。私の試みはここにあります(最初に説明したようにいくつかの問題がありますが、うまくいきません)。これは別の質問です。、この質問はスクリプトの最後の部分についてです)。私の主な問題は、バックグラウンドで実行されている実際のPythonスクリプトが完了したら、tmuxセッションを終了したいということです。私の完全な試みは次のとおりです。

# - get a job id for this tmux session
export SLURM_JOBID=$(python -c "import random;print(random.randint(0, 1_000_000))")
echo SLURM_JOBID = $SLURM_JOBID
export OUT_FILE=$PWD/main.sh.o$SLURM_JOBID
export ERR_FILE=$PWD/main.sh.e$SLURM_JOBID

# - CAREFUL, if a job is already running it could do damage to it, rm reauth process, qian doesn't do it so skip it
# top -u brando9
# pkill -9 reauth -u brando9

# - start tmux, 
https://unix.stackexchange.com/questions/724877/custom-kerberos-tmux-doesnt-let-me-name-my-sessions-help-forcing-it
tmux new -s $SLURM_JOBID
# /afs/cs/software/bin/krbtmux new -s $SLURM_JOBID
# cat /afs/cs/software/bin/krbtmux

# - reauth
# /afs/cs/software/bin/reauth
echo $SU_PASSWORD | /afs/cs/software/bin/reauth
# echo 'Secret' | /afs/cs/software/bin/reauth
# echo 'totally secret password' | kinit [email protected]
# to see reauth running
# top -u brando9 

# - expt python script
python expts.py &
python -u ~/diversity-for-predictive-success-of-meta-learning/div_src/diversity_src/experiment_mains/main_sl_with_ddp.py --manual_loads_name sl_hdb1_5cnn_adam_cl_filter_size --filter_size 4 > $OUT_FILE 2> $ERR_FILE &
export JOB_PID=$!
echo JOB_PID = $JOB_PID

# - Echo tmux id, should be jobid
tmux display-message -p '#S'
echo SLURM_JOBID = $SLURM_JOBID

# - detach current tmux session
tmux detach &

# - wait for pid from python to be done, if done kill this tmux sess
wait $JOB_PID
tmux ls
tmux kill-session -t $SLURM_JOBID
# check it was killed
tmux ls

# - Done
echo "Done with bash script (experiment or dispatched daemon experiments). "

しかし、上記はうまくいきません。 Pythonスクリプトが実行されスケジュールされたら、&私が望むのは、そのタスクが完了した後にtmuxセッションを終了することです。ついに試してみましたが、効果があるかどうか疑問でした。一度実行すると、tmux detach &tmuxセッションを終了し、wait ...tmuxの外部でコマンドを実行してデフォルトの端末をブロックするため、機能しないようです。代わりに、私が望むのは、tmux内でwaitコマンドを実行し(私をブロックしないように)、Pythonスクリプトが完了したらtmuxセッションを完全に終了することです。しかし、これは私のスクリプトの最後にコンテキストを追加するだけです。

どのように動作させることができますか?

関連:パスワードが必要なコマンドを使用してLinuxで認証するには?

ベストアンサー1

;演算子を使用してコマンドを連結し、&演算子を使用してバックグラウンドで送信できます。グループ全体をバックグラウンドで送信するには、コマンドを括弧で囲みます。以下はデモです:

tmux new -s test
(sleep 15 ; tmux kill-session -t test) &
tmux detach

while true ; do 
  if ! tmux ls 2> /dev/null | grep 'test:' ; then
    echo tmux test disconnected
    break
  fi
  sleep 1 # limit polling rate
done

おすすめ記事