
SSHを介してMacコンピュータからLinuxコンピュータにシミュレーションを実行しました。現在、複数のコマンドを並列に実行しており(バックグラウンドに配置)、操作が完了したら、関心のあるファイルを抽出してから、すべてのコマンド出力を削除して再実行します。
必要なファイルを自動的に抽出し、同じコマンドを再実行できるように、PIDを使用してこれらの操作が完了したことを確認できるかどうか疑問に思います。 ssh -cを介して実行されるコマンドのPIDを取得する方法を学ぶために、ここにメッセージを投稿します。これは私がしたことではありません(リモートLinuxにあるため)。
私はで示された解決策を試しました。起動したばかりのプロセスのPIDを取得する方法PIDを取得するには$! ssh -cとjobs -pはどちらも正しいPIDを提供していません。リモートで接続して動作しないのか(htopに表示されるコマンドはssh -c...です)か、それだけで間違っているのか気になります。
これは私の最初のbashスクリプトです。
#!/bin/bash
./createFiles.sh $1 # create the needed $1 folders
for i in $(seq 1 $1)
do
cd $i
myCommand &
cd ..
done
これが完了したら、次を使用します。
#!/bin/bash
for i in $(seq 1 $1)
do
cd $i
cp output/file.txt ../file_$2_$i.txt # $2 is the number of the run
cd ..
done
./deleteFiles.sh $2 # delete the needed $1 folders to start anew
その後、これら2つのループを5回繰り返しました。コンピュータの前に立たなくても自動的に5回繰り返すことができるのか気になりました。
誰もが良いアイデアを持っている場合:)
PS:確かに申し上げますが、英語は私の母国語ではありません。こんにちは
答え1
GNU Parallelを構築しています:)
--transfer --return --cleanup が目的のタスクを実行しています。
第8章を読んでください。https://zenodo.org/record/1146014
答え2
@mashuptwiceの答えのおかげで、これを行うことができました(たとえば、を使用して$$
スクリプト内からPIDを取得できますpgrep
)。
その後、bashを使用して目的の位置を取得しましたwhile
。 :D-s
sleep
透明性のため:
#!/bin/bash
for j in $(seq 1 $2)
do
./createFiles.sh $1 # create the needed $1 folders
for i in $(seq 1 $1)
do
cd $i
myCommand &
cd ..
done
sleep 5 # Wait to be sure that the commands were started
pgrep -u myUser myCommand > PIDs.txt
while [ -s PIDs.txt ]
do
echo not finished yet
pgrep -u myUser myCommand > PIDs.txt
sleep 10
done
cat PIDs.txt # Debug print
./mvFiles.sh $1 $j # extract the needed files and remove the now useless outputs
rm PIDs.txt
done