• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:同時実行数を指定&仕事は共有したい)

同時実行数を制限する方法とスクリプトの共有

このQ&Aのポイント
  • 複数のスクリプトを同時に実行する際に、同時実行数を制限する方法についてご質問です。また、スクリプトの共有についてもお聞かせください。
  • Ubuntuを使用している方が、複数のスクリプトを同時実行しながら同時実行数を制限する方法を知りたいとのことです。また、同じリソースを共有するスクリプトを実行したいとのことです。
  • 指定した同時実行数で複数のスクリプトを実行する方法や、スクリプトの共有についての質問です。具体的には、同時実行数を制限しながら指定した複数のスクリプトを順次実行する方法や、同じリソースを共有するスクリプトの実行方法について知りたいとのことです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

次のような内容のテキストファイル (cmdlist.txt) を 作っておき (絶対パスで書いておいたほうがいいでしょう) ---------------------------------- /home/ope/scripts/job_a.sh /home/ope/scripts/job_b.sh /home/ope/scripts/job_c.sh /home/ope/scripts/job_d.sh /home/ope/scripts/job_e.sh ---------------------------------- xargs -P 2 -n 1 /bin/sh -c < cmdlist.txt を起動すると、cmdlist.txt に書かれたコマンドを、 最大2並列 (-Pオプションで指定) で順に実行します。 xargsのオプションの意味は参照URLに記載しています。 ちなみに-PオプションがないUNIXもありますが、Linux系OSならほぼ確実にあるでしょう。

参考URL:
http://www.linux.or.jp/JM/html/GNU_findutils/man1/xargs.1.html
GGOOO
質問者

お礼

提示いただいたコマンド例で、理想的なシンプルさで実現できました。 大感謝です!!ありがとうございます。 xargsは初耳でした。面白いコマンドですね。 Pオプションの存在は便利すぎてビックリです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • .Batの同時実行回避について

    今までの説明のしかたが悪かったようですので、改めて投稿させていただきます。 Windows2008Server上の.Batプログラムで作成したジョブで問題がでています。 ジョブをコントロールしているジョブ管理ツールがあります。タスクマネージャとは別のソフトの運用管理ツールです。 このジョブ管理ツールで、ジョブの関係をコントロールしており、前のジョブが終わったら後続のジョブが起動するようになっています。 まず、前のジョブが終了したら、5個のジョブが起動するようにジョブ設計がされています。 この5個のジョブが同時刻で開始すると、1個のジョブだけ成功して、残りの4個が正常終了しないという状況になっています。 イメージとしては、下記のようなところです。 前の処理ZZの後処理に、下記5個のジョブがある。 前の処理ZZ→↓       A開始→→→→→→終了       B開始→終了       C開始→→→→→終了       D開始→→→→→→→→→終了       E開始→→→→終了 ジョブ管理ツールでは、前処理と後処理(AからE)の前後関係は作れますが、同時実行を回避することはできません。今回のAからEは、同時刻に開始するとジョブが正常終了しない形となっています。 ちなみに、AからEは、他の会社が作成したもので、できることなら変更を加えたくありません。また、その会社とは契約が切れていて、変更依頼できず、こちらで対応することになっています。 そこで、まず、次の対応しました。あまりやりたくなかったけれど、AからEの処理の先頭にtimeoutで5秒ずつずらす処理を埋め込みました。 しかし、AからEの処理には、ZZ以外に、それぞれ別の前処理がありました。そのそれぞれの前処理は処理時間が一定ではなく、いつ終了するのか分かりません。 そのため、timeoutで5秒ずつずらしても、AからEの処理開始が同時になる可能性があり、実際に同時に実行されることがあるのです。ありえないとは思いますが、発生しているのです。 ジョブの関係としては、次のイメージです。 ABEはtimeoutで5秒ずつずらすことで回避できるが、CDは回避できない。 前の処理ZZの後処理に、下記5個のジョブがある。 前の処理ZZ →→→→→↓  Aの前処理→→→終了 ⇒A開始→→→→終了   :この場合、ABEが同時開始  Bの前処理→終了   ⇒B開始→終了      :この場合、ABEが同時開始  Cの前処理→→→→→→→終了⇒C開始→終了  :この場合、CDが同時開始  Dの前処理→→→→→→→終了⇒D開始→→終了 :この場合、CDが同時開始  Eの前処理→→終了 ⇒E開始→→→→終了   :この場合、ABEが同時開始 この状況のため、AからEの処理に、同時起動を制御するプログラムを埋め込むことを考えていますが、どのようにコーディングしていくといいかわかりません。 今考えているのは、 AからEの処理の代わりに、AからEのジョブは、同じ排他制御プログラムを実行するように置き換える。 排他制御プログラムの中で、AからEのジョブを順番に実行するように切り替えるようして、開始時間を切り替えるのは、どうかなと思っています。 (変更後のイメージ) Aのジョブを排他制御プログラム実行置き換える。 Bのジョブを排他制御プログラム実行置き換える。 Cのジョブを排他制御プログラム実行置き換える。 Dのジョブを排他制御プログラム実行置き換える。 Eのジョブを排他制御プログラム実行置き換える。 排他制御プログラムでは、順番に、A~Eのプログラムを時間をずらして実行する。 ただ、この排他制御プログラム、AからEの処理を置き換える実行プログラムも作成できないスキルです。 この方法でいいのかも検討がついていない状態です。 なにとぞ、ソースプログラムを教えていただきたいところです。 とっくに締め切りが過ぎている問題ですので、大至急でお助けをお願いしたいです。

  • rshを使うスクリプトをバックグラウンド実行

    Linux+Perlでのお話です。 内部でsystem関数を使ってrshコマンドを実行しているperlスクリプト(以下、スクリプトAという)があります。 スクリプトAをフォアグラウンドで実行するとうまく流れるのですが、バックグラウンド実行すると、rshコマンドを実行した直後でjobが止まってしまいます。 もっと詳しく言いますと、スクリプトAのrshコマンドは、ディスクを共有しているリモートマシンに対して、スクリプトBを実行するように指示しています。 スクリプトBではとある計算を行なっており、その計算結果をファイルに出力しています。 そして、その結果をスクリプトAで読み込んで後処理を行うというものです。 ----- …(前処理)… system("rsh (ホスト名) \"(スクリプトB実行コマンド及び引数) 1> /dev/null 2> /dev/null\""); # ここでjobが止まってしまいます。 # ここで標準出力(ログファイルにリダイレクトしてる)に何か出力しようとしても、何も出力されてません。 (スクリプトBの結果ファイルの読み込み) …(後処理)… ----- Jobが止まってしまうと言っているのは、jobsコマンドで見ると"job stopped"となっている状態のことを言っています。 この状態でスクリプトBの結果はファイルに出力されているので、rshのコマンドはうまく投げられていると思います。 (「rshやsshは標準入力が期待されてるとバックグラウンド実行が出来ない」(?)というような記述をどこかで見かけたので、念のためrshに"< /dev/null"の記述を加えてもみたのですが、変わりませんでした) その後、止まっているjobをfgコマンドでフォアグラウンドで再開させると、最後まで問題なく実行されます。 フォアグラウンドで実行すればうまくいくのに、バックグラウンドで実行すると止まってしまうのが理解出来ません。 これは何が原因なのでしょうか。 そして、どうしたら解決出来るのか。 どなたかご存知でしたら、ご教示頂きたくお願い致します。

    • ベストアンサー
    • Perl
  • WSH(Excel出力)の同時実行数の制限

    WSHでExcel出力処理を行っているのですが、 同時実行数が30を超えると、Excelが不安定になるようで、  Set objBook = objExcelApp.Workbooks.Open("C:\xxx\zzz.xls", 0, False) の行で、  エラー:WorkbooksクラスのOpenプロパティを取得できません。  コード:800A03EC  ソース: Microsost Office Excel というエラーが発生して異常終了してしまうのです。 同時実行数の上限など、また、それ以外の原因について、 ご存知の方がいらっしゃいましたら、コメント頂ければ幸いです。 ちなみに、同時実行数が30未満の場合は、正常終了するので、 コードの内容には、問題ないと思っております。 Excelのバージョンは、2003で、ファイルの構成は、 wsfファイル(yyy.wsf) vbsファイル(wsh_excel.vbs)の2ファイルを配置し、 以下のような形で、実行しています。 Set WshShell = Server.CreateObject("WScript.Shell") Set objBatch = WshShell.Exec(strCmd)  ※ strCmdには、以下のような値が設定されます。     cmd.exe wscript.exe "C:\xxx\yyy.wsf" ■ yyy.wsfの内容 <?xml version="1.0" encoding="shift_jis" ?> <job id="zzz"> <script language="VBScript" src="wsh_excel.vbs"/> <script language="VBScript">  Call Excel_Main() </script> </job> ■ wsh_excel.vbsの内容(抜粋) Sub Excel_Main()  Set objExcelApp = Wscript.CreateObject("Excel.Application")  Set objBook = objExcelApp.Workbooks.Open("C:\xxx\zzz.xls", 0, False)     :     : End Sub

  • シェルの引数を、実行するパラメータに指定するには?

    シェル初心者です。 シェルの実行パラメータを、その中で実行する処理のパラメータに再び指定したいのですが可能でしょうか。 ただし、パラメータの数は可変です。 環境はSolarisです。 aaa.sh aaa bbb ccc aaa.shの中 bbbコマンド aaa bbb ccc ということを行いたいです。 パラメータ数が固定であれば問題なさそうですが 可変の場合、どのような記述をすればよいでしょうか?

  • 外部スクリプトを切り離して実行させたい

    負荷が高まった時に何が原因か調べる為に外部スクリプトを呼び出したいのですが、 スクリプトの中で外部スクリプトを呼び出すと、実行が終わるまで待ってしまいます。 たとえばこの様な1.shを実行した場合 1.shの中身 #!/bin/sh AVERAGE=`uptime|awk '{print $(NF-2)}'|sed 's|\.||;s|,||'` if [ $AVERAGE -gt 500 ] ; then 2.sh fi ~略~ 負荷が高まり,2.shを実行して、fiの後の処理は2.shが終わるまで待つ事になってしまいます。 2.shの実行を切り離してfiの後の処理もスムーズに行いたいです。 現在、切り離しの為、メール送信させてトリガで2.shを動かしてますが、 mailユーザで2.shを実行すると、動作が非常に遅いのです。 root権限で、かつ画面がある状態で実行すると高速に処理されるようでした。 メール送信時に実行するスクリプトを1.5.shに、sudoを利用して root権限で実行されるようにしましたが、画面がない為か処理が遅いのです。 1.5.shの中身 sudo su - root -c "2.sh" tty?のようなことだと考えてますが(アバウトですいません)画面がない所から実行すると よくないようで、メールトリガのやり方でなく、1.shから2.shを実行する時に切り離すことが できないだろうかと考えました。 画面が問題なら解決しないかもしれないですが、 どなたかご存知の方がいたら教えてくださいませ。

  • シェルの実行中にユーザ切り替えてコマンド実行

    はじめまして。 シェル初心者です。 shell.shをrootユーザでクーロン実行していますが、 shell.shの処理の中で、違うユーザでコマンド実行したいのですが、 可能かどうかも、方法が分かりません。 教えていただけないでしょうか。 環境はLinuxです。 下記のコマンドを実行したいです。 リモートでログインしてコマンド実行結果を取得する ssh -l tomcat server_tomcat grep test /tmp/test.log ※他のユーザでsshを実行してコマンド結果を取得したいです。 以上。宜しくお願い致します。

  • シェルスクリプト(.sh)で、10進数文字を16進数へ変換したい

    shスクリプトについて質問です。 10進数の0~15までが入った配列の値を、 10~15だけ、16進数のA~Fに変えたいです。 trコマンドで、"[:digit:]"っていうのがあったのですが、 全く使い方が見当たりませんでした^^; 何か一例いただけないでしょうか^^; 別にtrコマンドでなくても良いので、 どのようにすれば、shスクリプト内でやりたい事が できるか、教えていただけないでしょうかm(__)m

  • シェルでコマンドの実行結果を変数に格納する方法

    以下のようなコマンドライン引数を取得するシェルを書いたのですが 実行時にエラーになってしまいました。コマンド(第2引数以降を取得するコマンド)の実行結果を変数に格納するところでエラーになってしまいました。どのようにすればよろしいでしょうか。 「./test2.sh a b c d e」を実行し「a: コマンドが見つかりません」 というエラーが出てしまいます。 (test2.shの内容) #!/bin/sh OUTPUTFILE=$1 SRC_FILES=`"$@" | cut -d ' ' -f 2-` # 第二引数以降を取得 echo $OUTPUTFILE ←ここは表示される echo $SRC_FILES ←ここでエラー

  • [シェルスクリプト内で bashコマンド後のコマンドが実行されない]

    [シェルスクリプト内で bashコマンド後のコマンドが実行されない] 以下の様にシェルスクリプトを記述するとコマンド2が実行されません。 #! /bin/sh コマンド1 bash コマンド2 bash環境でコマンド2を実行させるにはどうしたら良いのでしょうか?

  • コマンドプロンプトとシェルでの実行結果の違い

    OS:Redhat AS v4.0 /etc/init.d/配下の実行ファイルをスクリプトの中で呼び出して いますが、何故かスクリプト実行時と個々のコマンドで実行した時と アプリの文字コードが違いますが、何が原因なのでしょうか? コマンドプロンプトで実行した時:(文字コード)正常 root#/etc/init.d/xxx restart スクリプト経由で実行時:(文字コード)異常root#/opt/tools/script.sh ※スクリプトで/etc/init.d/xxx restart を呼び出すます。。