Below is an example script for psched which demonstrates the scheduling system. This parallel-copying script implements the Pan-STARRS image copying system, which requests images from the summit and copies them to the appropriate computer. The first task in the script queries an external system for new image names with the function new.images. In the case of Pan-STARRS, this would be a request from OTIS, the observatory controlling system. The second task initiates the individual image copies, with separate CCDs being copied to separate computers. This script uses the concept of having specific machines assigned to specific CCDs (as Pan-STARRS intends to operate). The association is determined by calling the external function chip.host, providing the identifier of the chip in question. This returns an appropriate host. The copy.image function copies the file and also sends a message to the summit system to inform it that the image has been successfully copied.

You may download just the pcopy.pro script for a copy free of HTML code. Also available are the dummy scripts new.images, copy.image, and chip.host.


verbose on
queueinit newImages
exec echo 0 > new.last
exec cp -f raw.list new.list

controller host add po01
controller host add po02
controller host add po03
controller host add po04

# identify the images ready for copy 
# new entries are added to queue newImages
# need to compare the new list with the ones already being processed
task	       new.images
  command      new.images
  host         local

  periods      -poll 1
  periods      -exec 5
  periods      -timeout 5

  # success
  task.exit    0
    local i j Nstdout Nimages
    # compare output with new.image queue
    # keep only new entries
    queuesize stdout -var Nstdout
    for i 0 $Nstdout
      queuepop stdout -var line
      queuepush newImages -uniq -key 0 "$line"
    end
  end

  # locked list
  task.exit    1
    echo       "new.images: exec failure"
    $new.image.failure ++
  end

  # default exit status
  task.exit    default
    echo       "new.images: unknown exit status: $EXIT"
    $new.image.failure ++
  end

  # operation times out?
  task.exit    timeout
    echo       "new.images: timeout"
    $new.image.failure ++
  end
end

# copy new images, sending job to desired host
task	       copy.images
  periods      -poll 0.2
  periods      -exec 1
  periods      -timeout 5

  task.exec
    queuesize  newImages -var N
    if ($N == 0) break
    # if ($network == 0) break
    # if ($filesystem == 1) break
    
    queuepop newImages -var line
    list tmp -split $line
    $filename   = $tmp:0
    $chip       = $tmp:1
    $state      = $tmp:2
    if ($state == new) 
      # copy this image
      queuepush newImages -replace -key 0 "$filename $chip run"
    else
      # ignore this image
      queuepush newImages -replace -key 0 "$filename $chip $state"
      break
    end
    # echo $chip
    $host = `chip.host $chip`
    # echo $host
    host $host
    # echo "starting copy for $filename on $host..."
    command copy.image $filename $chip
  end

  # can I have access to argc,argv?

  # success
  task.exit    0
    echo "done copy..."
    queuepop stdout -var line
    list tmp -split $line
    $filename   = $tmp:0
    $chip       = $tmp:1
    exec mark.image $filename
    queuepush newImages -replace -key 0 "$filename $chip copy"
  end

  # default exit status
  task.exit    default
    echo       "new.images: unknown exit status: $EXIT"
    $new.image.failure ++
  end

  # operation times out?
  task.exit    timeout
    echo       "new.images: timeout"
    $new.image.failure ++
  end
end