Additional Scripts For User.Scripts Plugin


Recommended Posts

Idea:

A script that dumps an inventory of each disk using the 'tree' command (tree /mnt/disk1 > /boot/config/diskContents/disk1/$timestamp.txt) It should be able to 'logrotate' so we're keeping X (14?) number of days history.

 

I started this a few months ago, but never got around to really optimizing it and rotating out old listings or compressing them. But hopefully it'll give you a starting point!

 

#!/bin/sh

DISKS=8
COUNTER=1
THEDATE=`date +"%Y-%m-%d_%H-%M-%S"`
LOCATION="/boot/trees"

echo " "
echo " "
echo "Starting tree scanning"

while [ $COUNTER -le $DISKS ]
do
echo "Scanning tree for disk$COUNTER/Movies"
tree -h /mnt/disk$COUNTER/Movies >> "$LOCATION/$THEDATE.movies.log"
echo "Scanning tree for disk$COUNTER/TV"
tree -h /mnt/disk$COUNTER/TV >> "$LOCATION/$THEDATE.tv.log"
echo "Incrementing disk counter"
COUNTER=$[$COUNTER+1]
done
echo "Scanning tree for cache/Movies"
tree -h /mnt/cache/Movies >> "$LOCATION/$THEDATE.movies.log"
echo "Scanning tree for cache/TV"
tree -h /mnt/cache/TV >> "$LOCATION/$THEDATE.tv.log"
echo "All done scanning disks. Beginning scanning shares."
echo "Scanning tree for user/Movies"
tree -h /mnt/user/Movies >> "$LOCATION/$THEDATE.movies.log"
echo "Scanning tree for user/TV"
tree -h /mnt/user/TV >> "$LOCATION/$THEDATE.tv.log"
echo " "
echo " "
echo "Complete! Logs stored in $LOCATION"

 

  • Like 1
Link to comment

Idea:

A script that dumps an inventory of each disk using the 'tree' command (tree /mnt/disk1 > /boot/config/diskContents/disk1/$timestamp.txt) It should be able to 'logrotate' so we're keeping X (14?) number of days history.

 

I started this a few months ago, but never got around to really optimizing it and rotating out old listings or compressing them. But hopefully it'll give you a starting point!

 

I'm working on it, but I managed to come up with the guts of it, now I just gotta make it all pretty code! :)

 

I had it create entries in my temp share for the moment. I'll move it all to the flash drive when I polish this up.

for f in /mnt/disk*;do mkdir -p /mnt/user/temp/$(basename $f);tree -o /mnt/user/temp/$(basename $f)/$(date +%Y%m%d).txt "$f";done

Link to comment

Well, this was easier than I thought. This is a pretty basic script that runs the 'tree' command against each of your array disks, creating a txt of their contents. My primary purpose for this is to serve as an archive of my array contents in case I have a catastrophic failure, then I can easily discern what I'm missing and start rebuilding from backups/etc.

 

Default save directory goes to your flash drive in a subfolder called indexTree, with subfolders named for each disk containing a date stamped txt file.

 

#!/bin/sh
# Tree Index Array
#description=Creates an inventory tree of all mounted disks (not cache)
#arrayStarted=true

SAVEPATH=/boot/config/indexTree

for f in /mnt/disk*
do
    echo "Scanning tree for $f"
    mkdir -p $SAVEPATH/$(basename $f)
    tree -o $SAVEPATH/$(basename $f)/$(date +%Y%m%d).txt "$f"
done
echo "indexTree complete!"
exit 0

tree_index_array_drives.zip

  • Like 2
  • Thanks 1
  • Upvote 1
Link to comment

Can rsyncs be run using this plugin?  I get the following errors when I try to.

 

rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.2]

 

Here's an rsync script I put together. Please excuse if the echos are a little off.

 

Make sure to tweak it to match your cloud service.

 

I suggest checking out http://rclone.org/commands/rclone_sync/ and http://rclone.org/crypt/

 

#!/bin/bash

echo "<div style=' width: 40%; -webkit-border-radius: 8px 8px 0 0; border-radius: 8px 8px 0 0; border: solid 1px #cccccc; background-color: #ffe88a; padding-left: 10px;'><br><b><font color='black' size='2'>Backing-Up to BackBlaze B2 </font><b><br>  </div>"
#echo "======================="

#echo "Encryption enabled" 
#echo "Backing-up from:" 
#echo "  <b><font color='blue'>backup share "</b></font>"
#echo "to:"
#echo "  <b><font color='blue'>"Backblaze B2 sbucket </b></font>"

echo "<div style='width: 40%; -webkit-border-radius:  0 0 8px 8px; border-radius: 0 0 8px 8px; background-color: #ebebeb; margin-top: -14px; padding-left: 10px; padding-top: 6px;border: solid 1px #cccccc; '>Backing-up from: <br><b><font color='blue' size='2'>"backup share "</b></font> <br>to:<br><b><font color='blue' size='2'>"Backblaze B2 sbucket "</b></font><br> </div>"

rclone sync /mnt/user/backup secret:/

echo ""
echo "<div style='padding-left: 10px; margin-top: -14px; '><font color='green' size='4'><b>Done!</b></font></div>"

 

backup is my backup share and secret is my encrypted bucket on Backblaze B2.

Link to comment
  • 4 weeks later...

I was looking at the Mover code at a specific threshold script, however I was trying to figure out how to move oldest folder from a Disk to another Disk at a specific threshold. I normally move the oldest folder from a specific folder simply to reduce Disk spin ups across my array. Has anybody ever worked on something like that or could you throw me a bone on how to modify what somebody else has already done into something of the sort that I have slapped together?

 

My reasoning is I move "All" my files from my windows machine to:

Disk3 then to Disk5 for archiving

Disk2 then to Disk4 for archiving

 

Here is what my Slapped together code that works if I manually run it, but I'd like to incorporate Threshold into it:

 

#!/bin/sh
OLD="disk3"
NEW="disk5"

MoveSearch="`ls -t /mnt/$OLD/Movies/All/ | tail -n 1`"

echo moving $MoveSearch
mv /mnt/$OLD/Movies/All/$MoveSearch /mnt/$NEW/Movies/All/
echo $MoveSearch move complete

/usr/local/emhttp/plugins/dynamix/scripts/notify -e "Recovering Space" -d "Moving $MoveSearch from $OLD to $NEW" -i "normal" -m "Moved $MoveSearch from $OLD to $NEW"

 

The OLD and NEW Variable isn't required, but I just decided a while back it was easier for me to just drop it in so I could wash, rinse and repeat without digging in the code often when I wanted to run on multiple disks and reduce the error factor. Maybe someday I'll get fancy with it, but figured if I had a threshold script I could just let it run often and not worry about it.

 

I attempted for simplicity sake to just make a call from the mover script to what I've done, but apparently I messed things up and it just doesn't work. I deleted what I did a while back and just remembered recently and figured why not just ask here.

ok...  How about this:  (it's actually a lot simpler than it looks  ;) )

 

#!/usr/bin/php
<?PHP
# description=Moves a folder based upon utilization 
# arrayStarted=true

$source            = "/mnt/disk1/test";    # Note that mixing disk shares and user shares here will result in corrupted files
$destination       = "/mnt/disk2/test";    # Use either disk or user shares.  Not both.
$moveAt            = 90;                   # Utilization %  on the source to trigger the moves
$moveOldest        = true;                 # true moves the oldest files/folders first.  false moves the newest files/folders first
$emptySource       = false;                # false stops the moves when utilization drops below $moveAt.  true will move all of the files / folders
$runDuringCheck    = false;                # false pauses the moves during a parity check/rebuild.  true continues copying
$checkSleepTime    = 300;                  # seconds to delay before checking if a parity check is still in progress
$deleteDestination = true;                 # false if the destination file/folder already exists skips copying.  true deletes the version on the destination and then copies
$abortOnError      = true;                 # true aborts move operations if one of them results in an error.  false carries on with other files/folders
$finishScript      = false;                # false do nothing.  Set to something like "/boot/my_scripts/customScript.sh" to run a custom script at the completion of copying (notifications?)
$fullLogging       = false;                # set to true for full logging.  Useful for debugging.

function runMove() {
  global $source, $moveAt;

  $percent = (disk_total_space($source) - disk_free_space($source)) / disk_total_space($source) * 100;
  return ($percent > $moveAt);
}

function logger($string) {
  global $fullLogging;

  if ( $fullLogging ) {
    echo $string;
  }
}

if ( ! runMove() ) {
  echo "Set conditions to move are not met.  Exiting\n";
  exit();
}

$raw = array_diff(scandir($source),array(".",".."));
if ( ! $raw ) {
  echo "$source does not exist or is already empty\n";
  exit();
}
foreach ($raw as $entry) {
  $sourceContents[$entry] = filemtime("$source/$entry");
}
if ( $moveOldest ){
  asort($sourceContents);
} else {
  arsort($sourceContents);
}
logger(print_r($sourceContents,true));
$contents = array_keys($sourceContents);

exec("mkdir -p ".escapeshellarg($destination));

foreach ( $contents as $entry ) {
  if ( ! $emptySource ) {
    if ( ! runMove() ) {
      break;
    }
  }
  if ( ! $runDuringCheck ) {
    while ( true ) {
      $unRaidVars = parse_ini_file("/var/local/emhttp/var.ini");
      if ( ! $unRaidVars["mdResyncPos"] ) {
        break;
      }
      logger("Parity Check / Rebuild in progress.  Pausing $checkSleepTime seconds\n");
      sleep($checkSleepTime);
    }
  }
  if ( is_dir("$destination/$entry") ) {
    echo "$destination/$entry already exists.  ";
    if ( $deleteDestination ) {
      echo "Deleting prior to moving.\n";
      exec("rm -rf ".escapeshellarg("$destination/$entry"));
    } else {
      echo "Skipping.\n";
      continue;
    }
  }
  echo "Moving $source/$entry to $destination/$entry\n";
  exec("mv ".escapeshellarg("$source/$entry")." ".escapeshellarg("$destination/$entry"),$output,$returnValue);
  if ( $returnValue ) {
    echo "An error occurred moving $source/$entry to $destination/$entry  ";
    if ( $abortOnError ) {
      echo "Aborting\n";
      exit();
    } else {
      echo "Continuing\n";
    }
  }
}

if ( $finishScript ) {
  exec($finishScript,$finishOut);
  foreach ($finishOut as $line) {
    echo "$line\n";
  }
}
?>

Allows you to set the threshold of utilization on the source to trigger the move

Moves are selectable to either completely move the source or to stop after the threshold has been reached

Move either the oldest folders or the newest folders first

Option to pause during a parity check / rebuild

Option to skip if the folder to be moved already exists in the destination or to delete it and copy

Option to skip or abort if an error happens during the copy

Option to run a custom script (ie: notifications) upon completion.

Link to comment

Holly Molly.

 

Thank you so much for putting in the Time for something I really felt "I" needed. Hopefully others might feel the benifit from this. Now I can better automate my move files around based on what I don't use as much.

 

Ive also started tinkering around with my SSD drive seen as part of the user shares, but I disabled the mover so now I can have some help moving files when I want them and where I want them.

Link to comment

Ran the Threshold Script you wrote. Is there any way to force folders to keep their creation Date? Or does this script create brand new folders opposed to copying folders?

It uses mv the same as yours.  Your sample didn't preserve times, so mine didn't either  :D

 

But, its a simple change

 

#!/usr/bin/php
<?PHP
# description=Moves a folder based upon utilization 
# arrayStarted=true

$source            = "/mnt/disk2/test1";   # Note that mixing disk shares and user shares here will result in corrupted files
$destination       = "/mnt/disk1/test1";   # Use either disk or user shares.  Not both.
$moveAt            = 90;                   # Utilization %  on the source to trigger the moves
$moveOldest        = true;                 # true moves the oldest files/folders first.  false moves the newest files/folders first
$emptySource       = false;                # false stops the moves when utilization drops below $moveAt.  true will move all of the files / folders
$runDuringCheck    = false;                # false pauses the moves during a parity check/rebuild.  true continues copying
$checkSleepTime    = 300;                  # seconds to delay before checking if a parity check is still in progress
$deleteDestination = true;                 # false if the destination file/folder already exists skips copying.  true deletes the version on the destination and then copies
$abortOnError      = true;                 # true aborts move operations if one of them results in an error.  false carries on with other files/folders
$finishScript      = false;                # false do nothing.  Set to something like "/boot/my_scripts/customScript.sh" to run a custom script at the completion of copying (notifications?)
$fullLogging       = true;                 # set to true for full logging.  Useful for debugging.

function runMove() {
  global $source, $moveAt;

  $percent = (disk_total_space($source) - disk_free_space($source)) / disk_total_space($source) * 100;
  return ($percent > $moveAt);
}

function logger($string) {
  global $fullLogging;

  if ( $fullLogging ) {
    echo $string;
  }
}

if ( ! runMove() ) {
  echo "Set conditions to move are not met.  Exiting\n";
  exit();
}

$raw = array_diff(scandir($source),array(".",".."));
if ( ! $raw ) {
  echo "$source does not exist or is already empty\n";
  exit();
}
foreach ($raw as $entry) {
  $sourceContents[$entry] = filemtime("$source/$entry");
}
if ( $moveOldest ){
  asort($sourceContents);
} else {
  arsort($sourceContents);
}
logger(print_r($sourceContents,true));
$contents = array_keys($sourceContents);

exec("mkdir -p ".escapeshellarg($destination));

foreach ( $contents as $entry ) {
  if ( ! $emptySource ) {
    if ( ! runMove() ) {
      break;
    }
  }
  if ( ! $runDuringCheck ) {
    while ( true ) {
      $unRaidVars = parse_ini_file("/var/local/emhttp/var.ini");
      if ( ! $unRaidVars["mdResyncPos"] ) {
        break;
      }
      logger("Parity Check / Rebuild in progress.  Pausing $checkSleepTime seconds\n");
      sleep($checkSleepTime);
    }
  }
  if ( is_dir("$destination/$entry") ) {
    echo "$destination/$entry already exists.  ";
    if ( $deleteDestination ) {
      echo "Deleting prior to moving.\n";
      exec("rm -rf ".escapeshellarg("$destination/$entry"));
    } else {
      echo "Skipping.\n";
      continue;
    }
  }
  echo "Moving $source/$entry to $destination/$entry\n";
  exec("mv ".escapeshellarg("$source/$entry")." ".escapeshellarg("$destination/$entry"),$output,$returnValue);
  if ( $returnValue ) {
    echo "An error occurred moving $source/$entry to $destination/$entry  ";
    if ( $abortOnError ) {
      echo "Aborting\n";
      exit();
    } else {
      echo "Continuing\n";
    }
  } else {
    exec("touch --date=@".$sourceContents[$entry]." ".escapeshellarg("$destination/$entry"));
  }
}

if ( $finishScript ) {
  exec($finishScript,$finishOut);
  foreach ($finishOut as $line) {
    echo "$line\n";
  }
}
?>

 

or, if you've changed things around,

 

Change

  exec("mv ".escapeshellarg("$source/$entry")." ".escapeshellarg("$destination/$entry"),$output,$returnValue);
  if ( $returnValue ) {
    echo "An error occurred moving $source/$entry to $destination/$entry  ";
    if ( $abortOnError ) {
      echo "Aborting\n";
      exit();
    } else {
      echo "Continuing\n";
    }
  }

to

  exec("mv ".escapeshellarg("$source/$entry")." ".escapeshellarg("$destination/$entry"),$output,$returnValue);
  if ( $returnValue ) {
    echo "An error occurred moving $source/$entry to $destination/$entry  ";
    if ( $abortOnError ) {
      echo "Aborting\n";
      exit();
    } else {
      echo "Continuing\n";
    }
  } else {
    exec("touch --date=@".$sourceContents[$entry]." ".escapeshellarg("$destination/$entry"));
  }

 

Link to comment

Very simple script which will resume paused/suspended vms or start shut off vms.

 

#!/bin/sh
#description=Start / resume all VMs
#arrayStarted=true

virsh list --all | grep -E "(paused|suspended)$" | awk '{$1=""; print $0}' | sed -e 's/paused//g; s/suspended//g' | while read domain
  do
    echo "Resuming $domain ..."
    virsh resume "$domain"
    echo "Resuming $domain ..."
  done

virsh list --all | grep -E "(shut off)$" | awk '{$1=""; print $0}' | sed -e 's/shut off//g' | while read domain
  do
    echo "Starting $domain ..."
    virsh start "$domain"
    echo "Started $domain ..."
  done

  • Like 1
Link to comment

The following will do a btrfs scrub and report back the results through the notification interface, I have scheduled this monthly:

 

 

/usr/local/emhttp/plugins/dynamix/scripts/notify -e "start_scrub_cache" -s "Scrub cache drive" -d "Scrub of cache drive started" -i "normal" -m "Scrubbing message"
btrfs scrub start -rdB /mnt/cache > /boot/logs/scrub_cache.log
if [ $? -eq 0 ]
then
   /usr/local/emhttp/plugins/dynamix/scripts/notify -e "start_scrub_cache" -s "Scrub cache drive" -d "Scrub of cache drive finished" -i "normal" -m /boot/logs/scrub_cache.log
else
   /usr/local/emhttp/plugins/dynamix/scripts/notify -e "start_scrub_cache" -s "Scrub cache drive" -d "Error in scrub of cache drive !" -i "alert" -m /boot/logs/scrub_cache.log
fi

 

The following does an hourly check on Out of Memory errors in the syslog, I scheduled this hourly:

 

if grep -q "Out of memory" /var/log/syslog; then
   /usr/local/emhttp/plugins/dynamix/scripts/notify -e "OOM Checker" -s "Checked for OOM in syslog" -d "OOM error found in syslog" -i "alert" 
fi

  • Like 1
Link to comment

The following will do a btrfs scrub and report back the results through the notification interface, I have scheduled this monthly:

 

 

/usr/local/emhttp/plugins/dynamix/scripts/notify -e "start_scrub_cache" -s "Scrub cache drive" -d "Scrub of cache drive started" -i "normal" -m "Scrubbing message"
btrfs scrub start -rdB /mnt/cache > /boot/logs/scrub_cache.log
if [ $? -eq 0 ]
then
   /usr/local/emhttp/plugins/dynamix/scripts/notify -e "start_scrub_cache" -s "Scrub cache drive" -d "Scrub of cache drive finished" -i "normal" -m /boot/logs/scrub_cache.log
else
   /usr/local/emhttp/plugins/dynamix/scripts/notify -e "start_scrub_cache" -s "Scrub cache drive" -d "Error in scrub of cache drive !" -i "alert" -m /boot/logs/scrub_cache.log
fi

Personally, I would get rid of the redirect to /boot/logs/scrub_cache.log.  That way user scripts can display the logs.  But, the output is not persistent and will be lost over reboots.
Link to comment

The following will do a btrfs scrub and report back the results through the notification interface, I have scheduled this monthly:

 

 

/usr/local/emhttp/plugins/dynamix/scripts/notify -e "start_scrub_cache" -s "Scrub cache drive" -d "Scrub of cache drive started" -i "normal" -m "Scrubbing message"
btrfs scrub start -rdB /mnt/cache > /boot/logs/scrub_cache.log
if [ $? -eq 0 ]
then
   /usr/local/emhttp/plugins/dynamix/scripts/notify -e "start_scrub_cache" -s "Scrub cache drive" -d "Scrub of cache drive finished" -i "normal" -m /boot/logs/scrub_cache.log
else
   /usr/local/emhttp/plugins/dynamix/scripts/notify -e "start_scrub_cache" -s "Scrub cache drive" -d "Error in scrub of cache drive !" -i "alert" -m /boot/logs/scrub_cache.log
fi

Personally, I would get rid of the redirect to /boot/logs/scrub_cache.log.  That way user scripts can display the logs.  But, the output is not persistent and will be lost over reboots.

 

I allready took ik out on my side for the same reason.. :-)

Link to comment

Quick question, I have a very simple script to display the cache scrub status so I don't need to keep refreshing it or go to the console:

 

while true; do
    sleep 20
    btrfs scrub status /mnt/cache
    echo
done

 

Any way to clear the log so that it only displays the last status, instead of one after other:

scrub status for b675e964-7944-4715-9bb9-0425685b4e13
scrub started at Sun Jan 15 14:48:31 2017, running for 00:20:11
total bytes scrubbed: 1.37TiB with 0 errors

scrub status for b675e964-7944-4715-9bb9-0425685b4e13
scrub started at Sun Jan 15 14:48:31 2017, running for 00:20:31
total bytes scrubbed: 1.39TiB with 0 errors

scrub status for b675e964-7944-4715-9bb9-0425685b4e13
...

 

OK.  Here's a demonstration script (but it'll do what you want).  It requires user.scripts 2017.01.21a+ to work and shows a demo of directly utilizing javascript within a script to manipulate html DOMs, etc

 

A new variable called directPHP has been added to signal to the UI to run the script in this override mode.  I do not recommend any one using this variable in their own scripts without PM'ing me first.

 

Assuming a base folder of /boot/config/plugins/user.scripts/scripts/test you will need the following files:

 

/boot/config/plugins/user.scripts/scripts/test/script

<?
#directPHP=true
#description=Demonstration of directly running javascript within the output.

$updateTime = 1000;                                                              # time between updates in milliseconds
$supportExec = "/boot/config/plugins/user.scripts/scripts/test/scriptExec.php";  # Change This To Suit.
$unRaidvars = parse_ini_file("/var/local/emhttp/var.ini");
$csrf = $unRaidvars['csrf_token'];

exec("cp $supportExec /usr/local/emhttp/plugins/user.scripts/scriptSupportFile.php");
exec("chmod +x /usr/local/emhttp/plugins/user.scripts/scriptSupportFile.php");
echo "
  <script src='/webGui/javascript/dynamix.js'></script>
  <span id='output'></span>
  <script>
  $(document).ajaxSend(function(elm, xhr, s){
    if (s.type == 'POST') {
      s.data += s.data?'&':'';
      s.data += 'csrf_token=$csrf';
    }
  });
  var URL = '/plugins/user.scripts/scriptSupportFile.php';
  var Interval = setTimeout(updateDisplay,$updateTime);        
  
  function updateDisplay() {
    $.post(URL,{hasTo:'beHere'},function(data) {
      if (data) {
        $('#output').html(data);
        Interval = setTimeout(updateDisplay,$updateTime);
      }
    });
  }
  </script>
";

 

and

 

/boot/config/plugins/user.scripts/scripts/test/scriptExec.php (Note that this file must be formatted with linux style line endings.  Windows style line endings will not work here)

 

<?PHP
  $command = "btrfs scrub status /mnt/cache";  # Bash Command/script To Run... Change To Suit
  
  $output = shell_exec($command);
  $output = str_replace("\n","<br>",$output);
  echo $output;
?>

 

EDIT: Adjusted script to maintain compatibility with future versions of unRaid

Link to comment

PacMan

 

Play a version of PacMan directly on your server lol...  And no I didn't write it.  Merely adapted the program from https://github.com/bxia/Javascript-Pacman to work within user scripts.

 

Rather pointless I suppose, but you never know...

 

Unzip the attachment and store it within /config/plugins/user.scripts/scripts

 

Requires user.scripts 2017.01.21a+ to run

PacMan.zip

Link to comment

PacMan

 

Play a version of PacMan directly on your server lol...  And no I didn't write it.  Merely adapted the program from https://github.com/bxia/Javascript-Pacman to work within user scripts.

 

Rather pointless I suppose, but you never know...

 

Unzip the attachment and store it within /config/plugins/user.scripts/scripts

 

Requires user.scripts 2017.01.21a+ to run

 

Ha I like it. kept me entertained for a while :)

Link to comment

OK.  Here's a demonstration script (but it'll do what you want).  It requires user.scripts 2017.01.21a+ to work and shows a demo of directly utilizing javascript within a script to manipulate html DOMs, etc

 

A new variable called directPHP has been added to signal to the UI to run the script in this override mode.  I do not recommend any one using this variable in their own scripts without PM'ing me first.

 

Many thanks, does exactly what I wanted  8)

script.png.fdaa05b53a0403d7acfddb4314c0ce84.png

Link to comment

Enhancement Request for "Clear An unRaid Data Drive" script.

 

I executed this script via the command line rather than the User.Scripts plugin.

It would be good if the script accepted an argument to specify the disk to clear. It can still work the same if no argument present, but if the argument is there - simply check that drive only.

I had 13 drives in my array and wanted to clear the last one. I was forced to wait for ages while it checked all other drives before getting to the one I wanted to actually clear.

 

Thanks :)

noski

Link to comment

For the Clear an Unraid array data drive script, just how long should it take? I used it on a 500GB drive and it's been running for around 15 hours now.

 

I used the run in background option and I don't see any sort of progress indicator except that it says "Running".

Link to comment

For the Clear an Unraid array data drive script, just how long should it take? I used it on a 500GB drive and it's been running for around 15 hours now.

 

I used the run in background option and I don't see any sort of progress indicator except that it says "Running".

 

It's been over 24 hours and it's still running. Does it really take this long for a 500GB hard drive? I could have just pulled the drive and rebuilt parity and it would have been done by now.

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.