Я пытаюсь создать веб-интерфейс, который позволил бы пользователю запускать определенный фоновый скрипт в фоновом режиме, получать его содержимое и удалять временный файл, который использовался для хранения выходных данных. Пока у меня есть это:
<form method="POST">
<button type="submit" name="scan" class="btn btn-default">Run script</button>
</form>
<?php
if (isset($_POST['scan'])) {
$tmpfname = tempnam("/tmp", "SS-");
shell_exec('script.sh > '. $tmpfname .' &');
}
?>
<form method="POST">
<button type="submit" name="check-and-delete" class="btn btn-default">Check if script is running and delete the temporary file</button>
</form>
<?php
if (isset($_POST['check-and-delete'])) {
if (shell_exec("pgrep <its process>") != '') {
echo 'Script is running';
} else {
echo 'Script is NOT running';
echo '<pre>'. file_get_contents($tmpfname) .'</pre>';
unlink($tmpfname);
}
}
Тем не менее, хотя все, кажется, работает в соответствии с планом, в конце концов, $tmpfname
кажется пустым, что приводит к невозможности извлечь его содержимое и удалить его.
Это выглядит следующим образом:
Run script
,
1.1.
TMP файл создан;1.2.
Скрипт запускается и его вывод перенаправляется в файл tmp;Check if script is running and delete the temporary file
,
2.1.
Проверяется, запущен ли скрипт. Если скрипт все еще выполняется, ничего не делается, кроме эха;2.2.
Если скрипт не запущен (завершен), он должен получить содержимое файла tmp и удалить его;Проблема встречается в 2.2
, Как я могу сохранить имя временного файла / полный путь постоянно?
Это должно уточнить, что я имел в виду, говоря: магазин $tmpfname
в сеансе. Я не гарантирую, что этот код будет работать, могут быть и другие ошибки.
// always start sessions
session_start();
<form method="POST">
<button type="submit" name="scan" class="btn btn-default">Run script</button>
</form>
<?php
if (isset($_POST['scan'])) {
$tmpfname = tempnam(sys_get_temp_dir(), "SS-");
shell_exec('script.sh > '. $tmpfname .' &');
// store in session
$_SESSION['tmpfname'] = $tmpfname;
}
?>
<form method="POST">
<button type="submit" name="check-and-delete" class="btn btn-default">Check if script is running and delete the temporary file</button>
</form>
<?php
if (isset($_POST['check-and-delete'])) {
if (shell_exec("pgrep <its process>") != '') {
echo 'Script is running';
} else {
echo 'Script is NOT running';
// retrieve from session
$tmpfname = $_SESSION['tmpfname'];
echo '<pre>'. file_get_contents($tmpfname) .'</pre>';
unlink($tmpfname);
}
}
Других решений пока нет …