Drushの同時実行機能の使用方法


9

Drupalのマルチサイト(単一のコードベース、複数のサイト/ *)を使用しています。これに加えて、Drushエイリアスを使用してそれらを管理し始めました。

$ cat sites/all/drush/aliases.drushrc.php
<?php
$aliases['localdev'] = array(
  'site-list' => array(
    'site1', 
    'site2',
    'site3',
  ),
);
?>

これにより、すべてのサイトでアクションを簡単に実行できます。

$ drush @localdev cc all

>> また、@ sitesだけを使用して、drushrcファイルを無視できることもわかりました

これを行うと、私のサイトのそれぞれで(一度に1つずつ) "cc all"が実行されます。

私は次のレベルにこれを取ると、すべてのサイト上でこれらのコマンドを実行してみたいと思いsimulantiously。私はいくつかの読書をしており、Drush 確かにこれをサポートしているという印象を受けてます。drush_invoke_process()関数は、(関数のドキュメントから)を含めることができます$ backend_optionsを、取ります。

 *      'invoke-multiple'
 *        If $site_alias_record represents a single site, then 'invoke-multiple'
 *        will cause the _same_ command with the _same_ arguments and options
 *        to be invoked concurrently (e.g. for running concurrent batch processes).
 *      'concurrency'
 *        Limits the number of concurrent processes that will run at the same time.
 *        Defaults to '4'.

しかし、私が理解できないのは、Drushコマンドラインから実際にこれを使用する方法です。Drushに渡す必要があるオプションはありますか、それとも設定ファイルに何かを設定する必要がありますか?

どんな情報でも大歓迎です-私の好奇心はそそられます!

更新

以下の回答に基づいて、Drushの動作を示す簡単なテストを作成し、いくつかの結論を導き出すことができました。

複数のサイトで操作を実行するときのDrushのデフォルトの動作は、並行プロセスを使用することです。

$ drush @localdev ev "drupal_set_message(time()); sleep(5);"

Continue?  (y/n): y
site1             >> 1360512943      [status]
site2             >> 1360512943      [status]
site3             >> 1360512943      [status]

これはエイリアスを使用していない場合にも当てはまり、Drushの組み込み@sitesエイリアスを使用している場合にも当てはまります。これらの2つのコマンドは、上記と同じ動作をします。

$ drush site1,site2,site3 ev "drupal_set_message(time()); sleep(5);"
$ drush @sites ev "drupal_set_message(time()); sleep(5);"

並行プロセスの数(デフォルトは4)を変更するには、drushコマンドで '--concurrency = N'オプションを渡すことができます。たとえば、シリアル実行が必要な場合、並行プロセスの数を1に設定できます。

$ drush @localdev ev "drupal_set_message(time()); sleep(5);" --concurrency=1

Continue?  (y/n): y
site1             >> 1360513387      [status]
site2             >> 1360513393      [status]
site3             >> 1360513399      [status]

これは非常に良い要約です。それを書いてくれてありがとう。その情報がDrushのドキュメントのどこかにあったらすばらしいでしょう。私はそれを捕捉するために問題をオープンしました:drupal.org/node/1914224
greg_1_anderson

回答:


5

これは私のために働きました:

drush @site1,@site2,@site3,@site4 cc all --concurrency=4

それが実際にどれほど並行していたかはわかりません。site1に関する最後のメッセージは、site2の最初のメッセージの直後に送信され、他のすべてのメッセージは順番に出力されました。各cc操作が同時に発生した程度、またはシステムがCPUまたはI / Oにバインドされている程度を測定しませんでしたが、名目上は機能しているように見えました。


私はこれに似たもので作業していて、@sitesコマンドを使用して物事を行う便利な方法を実現しました。ただし、問題の1つは、サイトディレクトリがシンボリックリンクの場合、コマンドがそれを認識しないことです。:LS-lが与えられるように、私の場合にはシンボリックリンクは、Drupalのルートディレクトリの外にあるsite_dir -> ../../sites/site/src...多分それのバグをあなたがthelistを構築する責任がコードに私を指すことができれば、私は修正することができます
AWM

1

単一インスタンスの場合(サイトリストなし):

<?php
$aliases['localdev'] = array(
  'invoke-multiple' => TRUE,
);
?>

サイトリスト配列のエイリアスの場合、それは同時に実行されます...

以下のコメントの後、drush_invoke_processのコードを確認しましょう。-
//私のコメント、/* ... */-提供されたコードの短縮。

<?php
function drush_invoke_process($site_alias_record, $command_name, $commandline_args = array(), $commandline_options = array(), $backend_options = TRUE) {
  if (is_array($site_alias_record) && array_key_exists('site-list', $site_alias_record)) {
    /*  $invocations[] - this array filled with command for each site in site-list. */
  }
  else {
    /* aliases not defined or site-list not found.  So $invocations filled by one item. */
  }
  return drush_backend_invoke_concurrent($invocations, $commandline_options, $backend_options);
}
?>

次に呼ばれる:

<?php
function drush_backend_invoke_concurrent($invocations, $common_options = array(), $common_backend_options = array(), $default_command = NULL, $default_site = NULL, $context = NULL) {
  /* Here building command line happen for each site (invocation). */
  return _drush_backend_invoke($cmds, $common_backend_options, $context);
}
?>

次に呼び出されます:

<?php
function _drush_backend_invoke($cmds, $common_backend_options = array(), $context = NULL) {
  /* Some simulating code and fork code */
  if (array_key_exists('interactive', $common_backend_options) || array_key_exists('fork', $common_backend_options)) {
    /* Direct running (interactive or fork) */
  }
  else {
    // Concurrency set to 4 by default. So --concurency just override it by another value.
    $process_limit = drush_get_option_override($common_backend_options, 'concurrency', 4);

    // Next is main call, that run commands as concurent processes using proc_open and streaming:
    $procs = _drush_backend_proc_open($cmds, $process_limit, $context);

    /* Processing of result running of processes. */

  }
  return empty($ret) ? FALSE : $ret;
}
?>

明確にしていただけますか?サイトリストを使用する場合、Drushはすべてのサイトで同時にコマンドを自動的に実行すると言っていますか?Drushのメンテナがデフォルトの動作はシリアル実行drupal.org/node/628996#comment-2637008であると提案しているので、私は混乱しています。
rcourtna 2013

invoke-multipleは、同じサイトで同じオプションと引数を使用して同じコマンドを複数回実行するためのものです。複数のサイトで同じコマンドを実行するには、-concurrency = Nが必要です。とにかく、それが意図です。私は@sitesまたは 'site-list'でテストしませんでしたが、それが機能する場合は、意図した動作の外に迷っています。
greg_1_anderson 2013

あなたは--concurrencyについて正しいです。--concurrencyを指定せず、-invoke-multipleを指定せずにデバッグモードで複数のサイトでコマンドを実行すると、すべてのコマンドが同時に実行されていることが簡単にわかります。ただし、ここでも、 'invoke-multiple' => TRUEは何も実行せず、サイトエイリアスで2に設定すると、すべてのコマンドが2回実行されます。
greg_1_anderson 2013

2greg_1_anderson:エイリアスまたはサイトリストを設定しない場合、invoke_multiple設定は機能します...
Nikit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.