Fix: Vorzeitiger Abbruch bei großen Accounts nach 3600s Laufzeit
Betroffen: scan_, recover_, restore_, recreate_bad_signature.sh
und diagnose_share_key.sh
Bei Accounts mit sehr vielen bzw. sehr großen Dateien konnte der
jeweilige Pro-Account-Durchlauf länger als eine Stunde dauern und
wurde dann von PHP mit "Maximum execution time of 3600 seconds
exceeded" abgebrochen - mitten im Lauf, ohne jedes Ergebnis.
- su -c "$PHP_BIN ..." ruft PHP jetzt zusätzlich mit
-d max_execution_time=0 auf.
- Das allein reicht nicht: Nextclouds eigenes lib/base.php setzt
beim Bootstrap unbedingt (fest einprogrammiert, nicht
konfigurierbar) set_time_limit(3600) und überschreibt damit den
CLI-Flag wieder. Daher zusätzlich direkt nach dem require von
lib/base.php ein erneutes set_time_limit(0) in jedem der fünf
eingebetteten PHP-Scripte, das Nextclouds Reset seinerseits
rückgängig macht.
Kein Verhaltensunterschied für kleine/normale Accounts, betrifft
nur die maximale Laufzeit pro Account.
This commit is contained in:
@@ -812,11 +812,8 @@ if ! $_dry_run_explicit && $terminal ; then
|
||||
blank_line
|
||||
echo -e "\033[37m\033[1mWhich mode should this run use?\033[m"
|
||||
echo ""
|
||||
echo -e " \033[1m[1] Dry-run\033[m - go through everything (selection, re-validation, reporting),
|
||||
but write, back up and verify NOTHING"
|
||||
echo ""
|
||||
echo -e " \033[1m[1] Dry-run\033[m - go through everything (selection, re-validation, reporting), but write, back up and verify NOTHING"
|
||||
echo " [2] Real restore - actually back up, overwrite and verify each file in Nextcloud"
|
||||
|
||||
info "Just press Return to use the default: [1] Dry-run."
|
||||
echo -n " Select mode by number [1]: "
|
||||
read _mode_choice
|
||||
@@ -1228,6 +1225,13 @@ if ($oldWorkingDir === false) {
|
||||
}
|
||||
chdir(__DIR__);
|
||||
require_once __DIR__ . '/lib/base.php';
|
||||
// Nextcloud's own bootstrap (lib/base.php) unconditionally calls
|
||||
// set_time_limit(3600) as part of the require above - this OVERRIDES
|
||||
// whatever -d max_execution_time was passed on the PHP command line,
|
||||
// since it is a later, explicit runtime call. Undo that here, now that
|
||||
// the require is done, so restoring a large account isn't killed
|
||||
// after exactly one hour regardless of the CLI flag.
|
||||
set_time_limit(0);
|
||||
chdir($oldWorkingDir);
|
||||
|
||||
if (function_exists('posix_getuid') && posix_getuid() === 0) {
|
||||
@@ -1498,10 +1502,15 @@ for _user in "${selected_user_arr[@]}" ; do
|
||||
fi
|
||||
|
||||
if [[ -s "$list_file" ]] ; then
|
||||
# -d max_execution_time=0: re-validating and writing back every
|
||||
# selected file of a large account can run well over an hour;
|
||||
# without this the PHP CLI process is killed by PHP's own
|
||||
# execution-time limit (typically inherited from the webserver's
|
||||
# php.ini) mid-run.
|
||||
if $DRY_RUN ; then
|
||||
su -c "$PHP_BIN $restore_php_file $_user $list_file --dry-run" -s /bin/bash $HTTP_USER > "$user_result_tsv" 2> "$log_file"
|
||||
su -c "$PHP_BIN -d max_execution_time=0 $restore_php_file $_user $list_file --dry-run" -s /bin/bash $HTTP_USER > "$user_result_tsv" 2> "$log_file"
|
||||
else
|
||||
su -c "$PHP_BIN $restore_php_file $_user $list_file" -s /bin/bash $HTTP_USER > "$user_result_tsv" 2> "$log_file"
|
||||
su -c "$PHP_BIN -d max_execution_time=0 $restore_php_file $_user $list_file" -s /bin/bash $HTTP_USER > "$user_result_tsv" 2> "$log_file"
|
||||
fi
|
||||
_rc=$?
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user