Come utilizzare la capacità di esecuzione simultanea di Drush?


9

Sto usando Drupal multi-siti (base di codice singolo, più siti / *). Insieme a questo, ho iniziato a usare gli alias Drush per gestirli:

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

Ciò mi consente di eseguire facilmente azioni su tutti i siti:

$ drush @localdev cc all

>> Ho anche scoperto che posso semplicemente usare @sites e rinunciare al file drushrc .

In questo modo, eseguirò "cc all" su ciascuno dei miei siti in serie (uno alla volta).

Vorrei portarlo al livello successivo e provare a eseguire questi comandi su tutti i siti in modo simile . Ho letto e ho l'impressione che Drush lo sostenga davvero . La funzione drush_invoke_process () accetta $ backend_options, che può contenere (dalla documentazione della funzione):

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

Ciò che non riesco a capire, tuttavia, è come posso effettivamente utilizzarlo dalla riga di comando Drush . Esiste un'opzione che devo passare a Drush o devo impostare qualcosa in un file di impostazioni?

Ogni informazione sarà molto apprezzata - la mia curiosità è accesa!

AGGIORNARE

Sulla base delle risposte di seguito, sono stato in grado di creare un semplice test che dimostra il comportamento di Drush e trarre alcune conclusioni:

Il comportamento predefinito di Drush durante l'esecuzione di operazioni su più siti è l'utilizzo di processi simultanei:

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

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

Questo è vero anche quando non si usano gli alias, ed è vero anche quando si usa l'alias @sites incorporato di Drush. Questi due comandi producono un comportamento identico come sopra:

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

Per modificare il numero di processi simultanei (il valore predefinito è 4), l'opzione '--concurrency = N' può essere passata nel comando drush. Ad esempio, se voglio l'esecuzione seriale, posso impostare il numero di processi simultanei su 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]

Questo è un ottimo riassunto; grazie per averlo scritto. Sarebbe bello se quelle informazioni fossero nella documentazione Drush da qualche parte. Ho aperto un problema per catturarlo: drupal.org/node/1914224
greg_1_anderson

Risposte:


5

Questo ha funzionato per me:

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

Non sono sicuro di quanto simultaneamente fosse; l'ultimo messaggio su site1 è arrivato immediatamente dopo il primo messaggio per site2 e tutti gli altri messaggi sono stati stampati in sequenza. Non ho misurato in che misura ogni operazione cc sia avvenuta contemporaneamente, o in che misura il sistema potrebbe essere stato appena cpu o i / o vincolato, ma sembrava funzionare nominalmente.


Sto lavorando con qualcosa di simile a questo e ho realizzato un modo pratico di fare le cose usando il @sitescomando. Tuttavia, un inconveniente è che se la directory del sito è un collegamento simbolico, il comando non lo riconosce. nel mio caso il link simbolico è verso una dir al di fuori della radice drupal, quindi ls- l dà: site_dir -> ../../sites/site/src.. forse è un bug che posso correggere se puoi indicarmi il codice responsabile della compilazione della lista
awm

1

Per istanza singola (senza elenco siti):

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

Per gli alias con array di elenchi di siti verrà eseguito contemporaneamente ...

Dopo i commenti di seguito , esaminiamo il codice per drush_invoke_process:
//- il mio commento, /* ... */- abbreviazione del codice fornito.

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

Successivamente chiamato:

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

Il prossimo chiamerà:

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

Potete per favore chiarire? Stai dicendo che quando si utilizza un elenco di siti, Drush eseguirà automaticamente i comandi contemporaneamente su tutti i siti? Sono confuso perché un manutentore di Drush ha suggerito che il comportamento predefinito è l'esecuzione seriale drupal.org/node/628996#comment-2637008 .
rcourtna,

invoke-multiple serve per eseguire lo stesso comando sullo stesso sito con le stesse opzioni e argomenti più volte. Volete --concurrency = N per eseguire lo stesso comando su più siti. Questa è l'intenzione, comunque; Non ho testato con @sites o un 'elenco di siti', ma stai andando al di fuori del comportamento previsto, se dovesse succedere.
greg_1_anderson,

Hai ragione su --concurrency; se si esegue un comando su più siti in modalità debug senza --concurrency e senza --invoke-multiple, si può facilmente vedere che sta eseguendo tutti i comandi contemporaneamente. Ma ancora una volta, 'invoke-multiple' => TRUE non fa nulla e impostandolo su 2 in un alias del sito farebbe funzionare tutti i tuoi comandi due volte.
greg_1_anderson,

2greg_1_anderson: l'impostazione invoke_multiple funzionerà se non si imposta l'alias o l'elenco dei siti ...
Nikit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.