выполните несколько команд оболочки с помощью php nohup


Я хочу выполнить несколько команд оболочки с помощью команды php exec. Команды должны выполняться последовательно, и я хочу запустить их с помощью nohup, чтобы он мог работать в фоновом режиме, и моему php-скрипту не нужно было ждать его завершения. Вот мой сценарий:

$command1="nohup convert -trim +repage pic1.png pic2.png; convert pic2.png -thumbnail 500x10000 pic3.png; convert pic2.png -resize 115x1000 -gravity Center -crop 115x196+0+0  +repage pic4.png; rm pic1.png; rm pic2.png > /dev/null 2> /dev/null & echo $";
$output = exec($command1 . ' 2>&1', $output, $return);

Как вы можете видеть, это должно быть последовательно, потому что я хочу отредактировать изображение, которое было обрезано ранее. Команда сама по себе и последовательная часть работают хорошо, но nohup не работает в целом $command1.I я не уверен, действительно ли он ничего не делает или просто работает с последней командой (rm pic2.png).

Мы будем очень признательны за любую помощь. Спасибо

Author: Michael27, 2010-08-11

2 answers

Я решил свою проблему, хотя это своего рода обходной путь.

Я помещаю сценарий оболочки в пакетный скрипт, который я вызываю из php с помощью exec("nohup batch.sh > /dev/null 2>&1 &");

В пакетном сценарии я выполняю команды оболочки следующим образом: nohup convert -trim +repage pic1.png pic2.png && nohup convert pic2.png -thumbnail 500x10000 pic3.png &

Работает хорошо!

 2
Author: Michael27, 2010-08-13 09:38:41

Я задавал себе этот вопрос в течение многих лет, но я всегда думал, что нет другого решения, кроме как поместить все команды в сценарий и выполнить его следующим образом: nohup . ./multiplecommands.sh &

Я не знаю, почему я не попробовал это раньше, но, по крайней мере, этот крошечный тест сработал нормально. И оболочка не останавливается после ошибки. Если вы замените ; на && Я думаю, что так и будет, хотя

blup$ nohup echo ett > ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon ; echo tvaa >> ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon ; echo tre >> ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon ; echo fyra >> ~/tmptypo/nohup_on_multiple_commands_test_sep_thru_semicolon ; echo fem >> ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon ; cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon &
nohup: ignoring input and redirecting stderr to stdout
bash: /home/blubber/tmptypo/nohup_on_multiple_commands_test_sep_thru_semicolon: No such file or directory
[3] 27136
blub$ ett      #<-- this looks a bit ugly, though, but ignore the additional prompt now.
tvaa
tre
fem

[3]+  Done                    cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon
blub$ cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolonett
tvaa
tre
fem
blub$

СЛЕДОВАТЕЛЬНО: echo fyra не был выполнен, но echo fem был выполнен.

То же самое с AND = && вместо того, чтобы ;

blub2$ nohup echo one > ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon && echo two >> ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon && echo threefour >> ~/tmptypo/nohup_on_multiple_commands_test_sep_thru_semicolon && echo five >> ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon ; cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon &nohup: ignoring input and redirecting stderr to stdout
bash: /home/blubber2/tmptypo/nohup_on_multiple_commands_test_sep_thru_semicolon: No such file or directory
[3] 28744
blub$ one 
two

[3]+  Done                    cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon
blub$ cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon
one
two
blub$ 

СЛЕДОВАТЕЛЬНО: если вам нужен выход после сбоя, используйте && вместо ;

 0
Author: AMo, 2014-01-29 16:34:46