Wie verwende ich die gleichzeitige Ausführungsfunktion von Drush?

9

Ich verwende Drupal-Multi-Sites (einzelne Codebasis, mehrere Sites / *). Gleichzeitig habe ich begonnen, Drush-Aliase zu verwenden, um sie zu verwalten:

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

Auf diese Weise kann ich problemlos Aktionen auf allen Websites ausführen:

$ drush @localdev cc all

>> Ich habe auch gerade entdeckt, dass ich nur @sites verwenden und auf die drushrc-Datei verzichten kann .

Wenn Sie dies tun, wird "cc all" auf jeder meiner Sites in Reihe ausgeführt (einzeln).

Ich möchte dies auf die nächste Stufe nehmen und versuchen , diese Befehle auf allen Seiten laufen simulantiously . Ich habe etwas gelesen und habe den Eindruck, dass Drush dies tatsächlich unterstützt. Die Funktion drush_invoke_process () verwendet $ backend_options, die Folgendes enthalten können (aus der Funktionsdokumentation):

 *      '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'.

Was ich jedoch nicht herausfinden kann, ist, wie ich dies tatsächlich über die Drush-Befehlszeile verwende . Gibt es eine Option, die ich an Drush übergeben muss, oder muss ich etwas in einer Einstellungsdatei festlegen?

Jede Info wird sehr geschätzt - meine Neugier ist geweckt!

AKTUALISIEREN

Basierend auf den folgenden Antworten konnte ich einen einfachen Test erstellen, der Drushs Verhalten demonstriert, und einige Schlussfolgerungen ziehen:

Das Standardverhalten von Drush bei der Ausführung von Vorgängen an mehreren Standorten besteht darin, gleichzeitige Prozesse zu verwenden:

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

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

Dies gilt auch dann, wenn keine Aliase verwendet werden, und auch, wenn der in Drush integrierte Alias ​​@sites verwendet wird. Diese beiden Befehle ergeben ein identisches Verhalten wie oben:

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

Um die Anzahl der gleichzeitigen Prozesse zu ändern (Standard ist 4), kann die Option '--concurrency = N' im Befehl drush übergeben werden. Wenn ich beispielsweise eine serielle Ausführung möchte, kann ich die Anzahl der gleichzeitigen Prozesse auf 1 setzen:

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

Continue?  (y/n): y
site1             >> 1360513387      [status]
site2             >> 1360513393      [status]
site3             >> 1360513399      [status]
rcourtna
quelle
Das ist eine sehr gute Zusammenfassung; Danke, dass du es geschrieben hast. Es wäre großartig, wenn diese Informationen irgendwo in der Drush-Dokumentation wären. Ich habe ein Problem geöffnet, um das zu erfassen: drupal.org/node/1914224
greg_1_anderson

Antworten:

5

Das hat bei mir funktioniert:

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

Ich bin mir nicht sicher, wie gleichzeitig es tatsächlich war; Die letzte Nachricht zu Site1 kam unmittelbar nach der ersten Nachricht für Site2, und alle anderen Nachrichten wurden nacheinander gedruckt. Ich habe nicht gemessen, inwieweit jede CC-Operation gleichzeitig ablief oder inwieweit das System möglicherweise nur an CPU oder E / A gebunden war, aber es schien nominell zu funktionieren.

greg_1_anderson
quelle
Ich arbeite mit etwas Ähnlichem und habe eine praktische Möglichkeit gefunden, Dinge mit dem @sitesBefehl zu tun . Ein Fehler dabei ist jedoch, dass der Befehl das Site-Verzeichnis nicht erkennt, wenn es sich um einen Symlink handelt. In meinem Fall ist der Symlink zu einem Verzeichnis außerhalb der Drupal-Wurzel, also gibt site_dir -> ../../sites/site/srcich Folgendes an: .. Vielleicht ist es ein Fehler, den ich beheben kann, wenn Sie mich auf den Code verweisen können, der für die Erstellung der Liste verantwortlich ist
awm
1

Für eine einzelne Instanz (ohne Site-Liste):

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

Für Aliase mit Site-List-Array wird es sogar gleichzeitig ausgeführt ...

Lassen Sie uns nach den folgenden Kommentaren den Code für drush_invoke_process überprüfen:
//- Mein Kommentar, /* ... */- Verkürzung des bereitgestellten Codes.

<?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);
}
?>

Als nächstes genannt:

<?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);
}
?>

Als nächstes wird aufgerufen:

<?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;
}
?>
Nikit
quelle
Können Sie bitte klarstellen? Wollen Sie damit sagen, dass Drush bei Verwendung einer Site-Liste die Befehle automatisch gleichzeitig auf allen Sites ausführt? Ich bin verwirrt, weil ein Drush-Betreuer vorgeschlagen hat, dass das Standardverhalten die serielle Ausführung ist. Drupal.org/node/628996#comment-2637008 .
Rcourtna
invoke-multiple dient zum mehrmaligen Ausführen desselben Befehls auf derselben Site mit denselben Optionen und Argumenten. Sie möchten --concurrency = N, um denselben Befehl an mehreren Standorten auszuführen. Das ist sowieso die Absicht; Ich habe nicht mit @sites oder einer 'Site-Liste' getestet, aber Sie verirren sich außerhalb des beabsichtigten Verhaltens, sollte dies funktionieren.
Greg_1_anderson
Sie haben Recht mit --concurrency; Wenn Sie einen Befehl an mehreren Standorten im Debug-Modus ohne --concurrency und ohne --invoke-multiple ausführen, können Sie leicht erkennen, dass alle Befehle gleichzeitig ausgeführt werden. Aber auch hier bewirkt 'invoke-multiple' => TRUE nichts, und wenn Sie es in einem Site-Alias ​​auf 2 setzen, werden alle Ihre Befehle zweimal ausgeführt.
Greg_1_anderson
2greg_1_anderson: Die Einstellung invoke_multiple funktioniert, wenn Sie keinen Alias ​​oder
keine