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 파일을 잊어 버릴 수도 있음을 알게되었습니다 .

이렇게하면 각 사이트마다 한 번에 하나씩 "cc all"이 실행됩니다.

나는 이것을 다음 단계로 옮기고 모든 사이트에서 이러한 명령을 동시에 실행하려고합니다 . 나는 약간의 독서를하고 있으며, 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 별칭을 사용할 때도 마찬가지입니다. 이 두 명령은 위와 동일한 동작을합니다.

$ 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명령을 사용하여 편리한 일을 실현했습니다 . 그러나 한 가지 결함은 사이트 디렉토리가 심볼릭 링크이면 명령이이를 인식하지 못한다는 것입니다. LS-L주는, 그래서 내 경우에는 심볼릭 링크는 디렉토리의 외부의 드루팔 루트입니다 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

invoke-multiple은 동일한 옵션 및 인수를 사용하여 동일한 사이트에서 동일한 명령을 여러 번 실행하기위한 것입니다. 여러 사이트에서 동일한 명령을 실행하려면 --concurrency = N이 필요합니다. 그것은 어쨌든 의도입니다. @sites 또는 'site-list'로 테스트하지는 않았지만 의도 한 동작을 벗어나면 작동합니다.
greg_1_anderson

--concurrency에 대해 맞습니다. --concurrency없이 --invoke-multiple없이 디버그 모드로 여러 사이트에서 명령을 실행하면 모든 명령이 동시에 실행되고 있음을 쉽게 알 수 있습니다. 그러나 'invoke-multiple'=> TRUE는 아무 것도 수행하지 않으며 사이트 별칭에서 2로 설정하면 모든 명령이 두 번 실행됩니다.
greg_1_anderson

2greg_1_anderson : 별칭 또는 사이트 목록을 설정하지 않으면 invoke_multiple 설정이 작동합니다.
Nikit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.