rq 0.1.7 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (723) hide show
  1. data/INSTALL +21 -0
  2. data/README +752 -190
  3. data/TODO +18 -11
  4. data/TUTORIAL +230 -0
  5. data/all/install.rb +127 -0
  6. data/all/install.sh +165 -0
  7. data/all/packages/INSTALL +5 -0
  8. data/all/packages/arrayfields-3.6.0.tgz +0 -0
  9. data/all/packages/lockfile-1.4.1.tgz +0 -0
  10. data/all/packages/posixlock-0.0.1.tgz +0 -0
  11. data/all/packages/ruby-1.8.6.tgz +0 -0
  12. data/all/packages/rubygems-0.9.2.tgz +0 -0
  13. data/all/packages/sqlite-2.8.15.tar.gz +0 -0
  14. data/all/packages/sqlite-ruby-1.3.1.tar.gz +0 -0
  15. data/bin/rq +830 -361
  16. data/bin/rq-3.0.0 +860 -0
  17. data/doc/classes/ARGV.html +134 -0
  18. data/doc/classes/ARGV.src/M000036.html +36 -0
  19. data/doc/classes/ARGV.src/M000037.html +25 -0
  20. data/doc/classes/OrderedHash.html +1043 -0
  21. data/doc/classes/OrderedHash.src/M000003.html +26 -0
  22. data/doc/classes/OrderedHash.src/M000004.html +31 -0
  23. data/doc/classes/OrderedHash.src/M000005.html +23 -0
  24. data/doc/classes/OrderedHash.src/M000006.html +23 -0
  25. data/doc/classes/OrderedHash.src/M000007.html +24 -0
  26. data/doc/classes/OrderedHash.src/M000009.html +24 -0
  27. data/doc/classes/OrderedHash.src/M000010.html +24 -0
  28. data/doc/classes/OrderedHash.src/M000011.html +24 -0
  29. data/doc/classes/OrderedHash.src/M000012.html +24 -0
  30. data/doc/classes/OrderedHash.src/M000013.html +24 -0
  31. data/doc/classes/OrderedHash.src/M000014.html +24 -0
  32. data/doc/classes/OrderedHash.src/M000016.html +26 -0
  33. data/doc/classes/OrderedHash.src/M000017.html +25 -0
  34. data/doc/classes/OrderedHash.src/M000018.html +23 -0
  35. data/doc/classes/OrderedHash.src/M000019.html +25 -0
  36. data/doc/classes/OrderedHash.src/M000020.html +23 -0
  37. data/doc/classes/OrderedHash.src/M000021.html +24 -0
  38. data/doc/classes/OrderedHash.src/M000022.html +24 -0
  39. data/doc/classes/OrderedHash.src/M000023.html +24 -0
  40. data/doc/classes/OrderedHash.src/M000024.html +29 -0
  41. data/doc/classes/OrderedHash.src/M000025.html +29 -0
  42. data/doc/classes/OrderedHash.src/M000026.html +24 -0
  43. data/doc/classes/OrderedHash.src/M000027.html +25 -0
  44. data/doc/classes/OrderedHash.src/M000028.html +23 -0
  45. data/doc/classes/OrderedHash.src/M000029.html +25 -0
  46. data/doc/classes/OrderedHash.src/M000030.html +24 -0
  47. data/doc/classes/OrderedHash.src/M000032.html +23 -0
  48. data/doc/classes/OrderedHash.src/M000033.html +25 -0
  49. data/doc/classes/OrderedHash.src/M000034.html +36 -0
  50. data/doc/classes/OrderedHash.src/M000035.html +23 -0
  51. data/doc/classes/RQ.html +647 -0
  52. data/doc/classes/RQ/Backer.html +240 -0
  53. data/doc/classes/RQ/Backer.src/M000121.html +31 -0
  54. data/doc/classes/RQ/ConfigFile.html +416 -0
  55. data/doc/classes/RQ/ConfigFile.src/M000100.html +34 -0
  56. data/doc/classes/RQ/ConfigFile.src/M000101.html +26 -0
  57. data/doc/classes/RQ/ConfigFile.src/M000102.html +33 -0
  58. data/doc/classes/RQ/ConfigFile.src/M000103.html +25 -0
  59. data/doc/classes/RQ/ConfigFile.src/M000104.html +34 -0
  60. data/doc/classes/RQ/ConfigFile.src/M000105.html +25 -0
  61. data/doc/classes/RQ/Configurator.html +249 -0
  62. data/doc/classes/RQ/Configurator.src/M000122.html +40 -0
  63. data/doc/classes/RQ/Creator.html +264 -0
  64. data/doc/classes/RQ/Creator.src/M000157.html +32 -0
  65. data/doc/classes/RQ/Cron.html +461 -0
  66. data/doc/classes/RQ/Deleter.html +259 -0
  67. data/doc/classes/RQ/Deleter.src/M000078.html +52 -0
  68. data/doc/classes/RQ/Executor.html +249 -0
  69. data/doc/classes/RQ/Executor.src/M000099.html +45 -0
  70. data/doc/classes/RQ/Feeder.html +1131 -0
  71. data/doc/classes/RQ/Feeder.src/M000079.html +67 -0
  72. data/doc/classes/RQ/Feeder.src/M000080.html +47 -0
  73. data/doc/classes/RQ/Feeder.src/M000081.html +98 -0
  74. data/doc/classes/RQ/Feeder.src/M000082.html +25 -0
  75. data/doc/classes/RQ/Feeder.src/M000083.html +30 -0
  76. data/doc/classes/RQ/Feeder.src/M000084.html +58 -0
  77. data/doc/classes/RQ/Feeder.src/M000085.html +37 -0
  78. data/doc/classes/RQ/Feeder.src/M000086.html +40 -0
  79. data/doc/classes/RQ/Feeder.src/M000087.html +37 -0
  80. data/doc/classes/RQ/Feeder.src/M000088.html +35 -0
  81. data/doc/classes/RQ/Feeder.src/M000089.html +47 -0
  82. data/doc/classes/RQ/Feeder.src/M000090.html +25 -0
  83. data/doc/classes/RQ/Feeder.src/M000091.html +78 -0
  84. data/doc/classes/RQ/Feeder.src/M000092.html +34 -0
  85. data/doc/classes/RQ/Feeder.src/M000093.html +36 -0
  86. data/doc/classes/RQ/Feeder.src/M000094.html +25 -0
  87. data/doc/classes/RQ/Feeder.src/M000095.html +27 -0
  88. data/doc/classes/RQ/IOViewer.html +256 -0
  89. data/doc/classes/RQ/Job.html +304 -0
  90. data/doc/classes/RQ/Job.src/M000168.html +26 -0
  91. data/doc/classes/RQ/Job.src/M000169.html +37 -0
  92. data/doc/classes/RQ/Job.src/M000170.html +23 -0
  93. data/doc/classes/RQ/Job/Methods.html +210 -0
  94. data/doc/classes/RQ/JobQueue.html +1780 -0
  95. data/doc/classes/RQ/JobQueue.src/M000176.html +31 -0
  96. data/doc/classes/RQ/JobQueue.src/M000177.html +34 -0
  97. data/doc/classes/RQ/JobQueue.src/M000178.html +60 -0
  98. data/doc/classes/RQ/JobQueue.src/M000179.html +63 -0
  99. data/doc/classes/RQ/JobQueue.src/M000180.html +73 -0
  100. data/doc/classes/RQ/JobQueue.src/M000181.html +217 -0
  101. data/doc/classes/RQ/JobQueue.src/M000182.html +50 -0
  102. data/doc/classes/RQ/JobQueue.src/M000183.html +83 -0
  103. data/doc/classes/RQ/JobQueue.src/M000184.html +25 -0
  104. data/doc/classes/RQ/JobQueue.src/M000185.html +83 -0
  105. data/doc/classes/RQ/JobQueue.src/M000186.html +28 -0
  106. data/doc/classes/RQ/JobQueue.src/M000187.html +26 -0
  107. data/doc/classes/RQ/JobQueue.src/M000188.html +26 -0
  108. data/doc/classes/RQ/JobQueue.src/M000189.html +32 -0
  109. data/doc/classes/RQ/JobQueue.src/M000190.html +30 -0
  110. data/doc/classes/RQ/JobQueue.src/M000191.html +37 -0
  111. data/doc/classes/RQ/JobQueue.src/M000192.html +36 -0
  112. data/doc/classes/RQ/JobQueue.src/M000193.html +25 -0
  113. data/doc/classes/RQ/JobQueue.src/M000194.html +25 -0
  114. data/doc/classes/RQ/JobQueue.src/M000195.html +25 -0
  115. data/doc/classes/RQ/JobQueue.src/M000196.html +25 -0
  116. data/doc/classes/RQ/JobQueue.src/M000197.html +25 -0
  117. data/doc/classes/RQ/JobQueue.src/M000198.html +73 -0
  118. data/doc/classes/RQ/JobQueue.src/M000199.html +25 -0
  119. data/doc/classes/RQ/JobQueue.src/M000200.html +38 -0
  120. data/doc/classes/RQ/JobQueue.src/M000201.html +28 -0
  121. data/doc/classes/RQ/JobQueue/Error.html +187 -0
  122. data/doc/classes/RQ/JobRunner.html +386 -0
  123. data/doc/classes/RQ/JobRunner.src/M000117.html +53 -0
  124. data/doc/classes/RQ/JobRunner.src/M000118.html +26 -0
  125. data/doc/classes/RQ/JobRunnerDaemon.html +590 -0
  126. data/doc/classes/RQ/JobRunnerDaemon.src/M000159.html +94 -0
  127. data/doc/classes/RQ/JobRunnerDaemon.src/M000160.html +27 -0
  128. data/doc/classes/RQ/JobRunnerDaemon.src/M000161.html +39 -0
  129. data/doc/classes/RQ/JobRunnerDaemon.src/M000162.html +27 -0
  130. data/doc/classes/RQ/JobRunnerDaemon.src/M000163.html +27 -0
  131. data/doc/classes/RQ/JobRunnerDaemon.src/M000164.html +28 -0
  132. data/doc/classes/RQ/JobRunnerDaemon.src/M000165.html +28 -0
  133. data/doc/classes/RQ/JobRunnerDaemon.src/M000166.html +37 -0
  134. data/doc/classes/RQ/JobRunnerDaemon.src/M000167.html +25 -0
  135. data/doc/classes/RQ/Lister.html +256 -0
  136. data/doc/classes/RQ/Lister.src/M000156.html +52 -0
  137. data/doc/classes/RQ/Locker.html +250 -0
  138. data/doc/classes/RQ/Locker.src/M000120.html +40 -0
  139. data/doc/classes/RQ/Logging.html +296 -0
  140. data/doc/classes/RQ/Logging.src/M000067.html +28 -0
  141. data/doc/classes/RQ/Logging/LogClassMethods.html +254 -0
  142. data/doc/classes/RQ/Logging/LogClassMethods.src/M000068.html +32 -0
  143. data/doc/classes/RQ/Logging/LogClassMethods.src/M000069.html +28 -0
  144. data/doc/classes/RQ/Logging/LogMethods.html +404 -0
  145. data/doc/classes/RQ/Logging/LogMethods.src/M000070.html +35 -0
  146. data/doc/classes/RQ/Logging/LogMethods.src/M000071.html +28 -0
  147. data/doc/classes/RQ/Logging/LogMethods.src/M000072.html +21 -0
  148. data/doc/classes/RQ/Logging/LogMethods.src/M000073.html +21 -0
  149. data/doc/classes/RQ/Logging/LogMethods.src/M000074.html +21 -0
  150. data/doc/classes/RQ/Logging/LogMethods.src/M000075.html +21 -0
  151. data/doc/classes/RQ/Logging/LogMethods.src/M000076.html +21 -0
  152. data/doc/classes/RQ/Logging/LogMethods.src/M000077.html +29 -0
  153. data/doc/classes/RQ/Logging/LoggerExt.html +194 -0
  154. data/doc/classes/RQ/Main.html +2110 -0
  155. data/doc/classes/RQ/MainHelper.html +607 -0
  156. data/doc/classes/RQ/MainHelper.src/M000171.html +33 -0
  157. data/doc/classes/RQ/MainHelper.src/M000172.html +32 -0
  158. data/doc/classes/RQ/MainHelper.src/M000173.html +44 -0
  159. data/doc/classes/RQ/OrderedAutoHash.html +258 -0
  160. data/doc/classes/RQ/OrderedAutoHash.src/M000205.html +25 -0
  161. data/doc/classes/RQ/OrderedAutoHash.src/M000206.html +25 -0
  162. data/doc/classes/RQ/QDB.html +1653 -0
  163. data/doc/classes/RQ/QDB.src/M000126.html +25 -0
  164. data/doc/classes/RQ/QDB.src/M000127.html +37 -0
  165. data/doc/classes/RQ/QDB.src/M000128.html +27 -0
  166. data/doc/classes/RQ/QDB.src/M000129.html +27 -0
  167. data/doc/classes/RQ/QDB.src/M000130.html +27 -0
  168. data/doc/classes/RQ/QDB.src/M000131.html +31 -0
  169. data/doc/classes/RQ/QDB.src/M000132.html +32 -0
  170. data/doc/classes/RQ/QDB.src/M000133.html +30 -0
  171. data/doc/classes/RQ/QDB.src/M000134.html +91 -0
  172. data/doc/classes/RQ/QDB.src/M000135.html +26 -0
  173. data/doc/classes/RQ/QDB.src/M000136.html +46 -0
  174. data/doc/classes/RQ/QDB.src/M000137.html +26 -0
  175. data/doc/classes/RQ/QDB.src/M000138.html +51 -0
  176. data/doc/classes/RQ/QDB.src/M000139.html +61 -0
  177. data/doc/classes/RQ/QDB.src/M000140.html +57 -0
  178. data/doc/classes/RQ/QDB.src/M000141.html +25 -0
  179. data/doc/classes/RQ/QDB.src/M000142.html +25 -0
  180. data/doc/classes/RQ/QDB.src/M000143.html +37 -0
  181. data/doc/classes/RQ/QDB.src/M000144.html +107 -0
  182. data/doc/classes/RQ/QDB.src/M000145.html +40 -0
  183. data/doc/classes/RQ/QDB.src/M000146.html +34 -0
  184. data/doc/classes/RQ/QDB.src/M000147.html +33 -0
  185. data/doc/classes/RQ/QDB.src/M000148.html +32 -0
  186. data/doc/classes/RQ/QDB.src/M000149.html +98 -0
  187. data/doc/classes/RQ/QDB.src/M000150.html +26 -0
  188. data/doc/classes/RQ/QDB.src/M000151.html +31 -0
  189. data/doc/classes/RQ/QDB.src/M000154.html +26 -0
  190. data/doc/classes/RQ/QDB/AbortedTransactionError.html +187 -0
  191. data/doc/classes/RQ/QDB/RollbackTransactionError.html +187 -0
  192. data/doc/classes/RQ/Querier.html +328 -0
  193. data/doc/classes/RQ/Querier.src/M000203.html +45 -0
  194. data/doc/classes/RQ/Querier.src/M000204.html +78 -0
  195. data/doc/classes/RQ/ReSubmitter.html +307 -0
  196. data/doc/classes/RQ/ReSubmitter.src/M000098.html +111 -0
  197. data/doc/classes/RQ/Recoverer.html +247 -0
  198. data/doc/classes/RQ/Refresher.html +346 -0
  199. data/doc/classes/RQ/Refresher.src/M000174.html +51 -0
  200. data/doc/classes/RQ/Refresher.src/M000175.html +44 -0
  201. data/doc/classes/RQ/Relayer.html +723 -0
  202. data/doc/classes/RQ/Relayer.src/M000106.html +91 -0
  203. data/doc/classes/RQ/Relayer.src/M000107.html +47 -0
  204. data/doc/classes/RQ/Relayer.src/M000108.html +46 -0
  205. data/doc/classes/RQ/Relayer.src/M000109.html +26 -0
  206. data/doc/classes/RQ/Relayer.src/M000110.html +46 -0
  207. data/doc/classes/RQ/Relayer.src/M000111.html +40 -0
  208. data/doc/classes/RQ/Relayer.src/M000112.html +37 -0
  209. data/doc/classes/RQ/Relayer.src/M000113.html +40 -0
  210. data/doc/classes/RQ/Relayer.src/M000114.html +27 -0
  211. data/doc/classes/RQ/Relayer.src/M000115.html +25 -0
  212. data/doc/classes/RQ/Relayer.src/M000116.html +38 -0
  213. data/doc/classes/RQ/Resource.html +187 -0
  214. data/doc/classes/RQ/ResourceManager.html +276 -0
  215. data/doc/classes/RQ/Rotater.html +324 -0
  216. data/doc/classes/RQ/Rotater.src/M000158.html +71 -0
  217. data/doc/classes/RQ/SleepCycle.html +322 -0
  218. data/doc/classes/RQ/SleepCycle.src/M000123.html +32 -0
  219. data/doc/classes/RQ/SleepCycle.src/M000124.html +27 -0
  220. data/doc/classes/RQ/SleepCycle.src/M000125.html +25 -0
  221. data/doc/classes/RQ/Snapshotter.html +250 -0
  222. data/doc/classes/RQ/Snapshotter.src/M000097.html +35 -0
  223. data/doc/classes/RQ/StatusLister.html +289 -0
  224. data/doc/classes/RQ/StatusLister.src/M000096.html +26 -0
  225. data/doc/classes/RQ/Submitter.html +319 -0
  226. data/doc/classes/RQ/Submitter.src/M000119.html +92 -0
  227. data/doc/classes/RQ/Toucher.html +384 -0
  228. data/doc/classes/RQ/Updater.html +304 -0
  229. data/doc/classes/RQ/Updater.src/M000202.html +97 -0
  230. data/doc/classes/RQ/Usage.html +346 -0
  231. data/doc/classes/RQ/Usage.src/M000038.html +29 -0
  232. data/doc/classes/RQ/Usage.src/M000039.html +72 -0
  233. data/doc/classes/RQ/Util.html +1043 -0
  234. data/doc/classes/RQ/Util.src/M000040.html +27 -0
  235. data/doc/classes/RQ/Util.src/M000041.html +26 -0
  236. data/doc/classes/RQ/Util.src/M000042.html +25 -0
  237. data/doc/classes/RQ/Util.src/M000043.html +25 -0
  238. data/doc/classes/RQ/Util.src/M000044.html +30 -0
  239. data/doc/classes/RQ/Util.src/M000045.html +25 -0
  240. data/doc/classes/RQ/Util.src/M000046.html +34 -0
  241. data/doc/classes/RQ/Util.src/M000047.html +31 -0
  242. data/doc/classes/RQ/Util.src/M000048.html +41 -0
  243. data/doc/classes/RQ/Util.src/M000049.html +27 -0
  244. data/doc/classes/RQ/Util.src/M000050.html +34 -0
  245. data/doc/classes/RQ/Util.src/M000051.html +28 -0
  246. data/doc/classes/RQ/Util.src/M000052.html +27 -0
  247. data/doc/classes/RQ/Util.src/M000053.html +31 -0
  248. data/doc/classes/RQ/Util.src/M000054.html +31 -0
  249. data/doc/classes/RQ/Util.src/M000055.html +31 -0
  250. data/doc/classes/RQ/Util.src/M000056.html +25 -0
  251. data/doc/classes/RQ/Util.src/M000057.html +25 -0
  252. data/doc/classes/RQ/Util.src/M000058.html +25 -0
  253. data/doc/classes/RQ/Util.src/M000059.html +25 -0
  254. data/doc/classes/RQ/Util.src/M000060.html +25 -0
  255. data/doc/classes/RQ/Util.src/M000061.html +27 -0
  256. data/doc/classes/RQ/Util.src/M000062.html +28 -0
  257. data/doc/classes/RQ/Util.src/M000063.html +39 -0
  258. data/doc/classes/RQ/Util.src/M000064.html +39 -0
  259. data/doc/classes/RQ/Util.src/M000065.html +31 -0
  260. data/doc/classes/RQ/Util.src/M000066.html +29 -0
  261. data/doc/classes/SQLite.html +120 -0
  262. data/doc/classes/SQLite/Database.html +546 -0
  263. data/doc/classes/SQLite/TypeTranslator.html +221 -0
  264. data/doc/created.rid +1 -0
  265. data/doc/dot/f_0.dot +14 -0
  266. data/doc/dot/f_0.jpg +0 -0
  267. data/doc/dot/f_1.dot +14 -0
  268. data/doc/dot/f_1.jpg +0 -0
  269. data/doc/dot/f_10.dot +802 -0
  270. data/doc/dot/f_10.jpg +0 -0
  271. data/doc/dot/f_11.dot +14 -0
  272. data/doc/dot/f_11.jpg +0 -0
  273. data/doc/dot/f_12.dot +802 -0
  274. data/doc/dot/f_12.jpg +0 -0
  275. data/doc/dot/f_13.dot +802 -0
  276. data/doc/dot/f_13.jpg +0 -0
  277. data/doc/dot/f_14.dot +802 -0
  278. data/doc/dot/f_14.jpg +0 -0
  279. data/doc/dot/f_15.dot +802 -0
  280. data/doc/dot/f_15.jpg +0 -0
  281. data/doc/dot/f_16.dot +802 -0
  282. data/doc/dot/f_16.jpg +0 -0
  283. data/doc/dot/f_17.dot +802 -0
  284. data/doc/dot/f_17.jpg +0 -0
  285. data/doc/dot/f_18.dot +14 -0
  286. data/doc/dot/f_18.jpg +0 -0
  287. data/doc/dot/f_19.dot +802 -0
  288. data/doc/dot/f_19.jpg +0 -0
  289. data/doc/dot/f_2.dot +14 -0
  290. data/doc/dot/f_2.jpg +0 -0
  291. data/doc/dot/f_20.dot +802 -0
  292. data/doc/dot/f_20.jpg +0 -0
  293. data/doc/dot/f_21.dot +802 -0
  294. data/doc/dot/f_21.jpg +0 -0
  295. data/doc/dot/f_22.dot +802 -0
  296. data/doc/dot/f_22.jpg +0 -0
  297. data/doc/dot/f_23.dot +802 -0
  298. data/doc/dot/f_23.jpg +0 -0
  299. data/doc/dot/f_24.dot +802 -0
  300. data/doc/dot/f_24.jpg +0 -0
  301. data/doc/dot/f_25.dot +817 -0
  302. data/doc/dot/f_25.jpg +0 -0
  303. data/doc/dot/f_26.dot +29 -0
  304. data/doc/dot/f_26.jpg +0 -0
  305. data/doc/dot/f_27.dot +802 -0
  306. data/doc/dot/f_27.jpg +0 -0
  307. data/doc/dot/f_28.dot +802 -0
  308. data/doc/dot/f_28.jpg +0 -0
  309. data/doc/dot/f_29.dot +802 -0
  310. data/doc/dot/f_29.jpg +0 -0
  311. data/doc/dot/f_3.dot +14 -0
  312. data/doc/dot/f_3.jpg +0 -0
  313. data/doc/dot/f_30.dot +802 -0
  314. data/doc/dot/f_30.jpg +0 -0
  315. data/doc/dot/f_31.dot +802 -0
  316. data/doc/dot/f_31.jpg +0 -0
  317. data/doc/dot/f_32.dot +802 -0
  318. data/doc/dot/f_32.jpg +0 -0
  319. data/doc/dot/f_33.dot +802 -0
  320. data/doc/dot/f_33.jpg +0 -0
  321. data/doc/dot/f_34.dot +802 -0
  322. data/doc/dot/f_34.jpg +0 -0
  323. data/doc/dot/f_35.dot +802 -0
  324. data/doc/dot/f_35.jpg +0 -0
  325. data/doc/dot/f_36.dot +802 -0
  326. data/doc/dot/f_36.jpg +0 -0
  327. data/doc/dot/f_37.dot +802 -0
  328. data/doc/dot/f_37.jpg +0 -0
  329. data/doc/dot/f_38.dot +54 -0
  330. data/doc/dot/f_38.jpg +0 -0
  331. data/doc/dot/f_39.dot +802 -0
  332. data/doc/dot/f_39.jpg +0 -0
  333. data/doc/dot/f_4.dot +802 -0
  334. data/doc/dot/f_4.jpg +0 -0
  335. data/doc/dot/f_40.dot +802 -0
  336. data/doc/dot/f_40.jpg +0 -0
  337. data/doc/dot/f_41.dot +802 -0
  338. data/doc/dot/f_41.jpg +0 -0
  339. data/doc/dot/f_42.dot +802 -0
  340. data/doc/dot/f_42.jpg +0 -0
  341. data/doc/dot/f_43.dot +802 -0
  342. data/doc/dot/f_43.jpg +0 -0
  343. data/doc/dot/f_44.dot +802 -0
  344. data/doc/dot/f_44.jpg +0 -0
  345. data/doc/dot/f_5.dot +802 -0
  346. data/doc/dot/f_5.jpg +0 -0
  347. data/doc/dot/f_6.dot +802 -0
  348. data/doc/dot/f_6.jpg +0 -0
  349. data/doc/dot/f_7.dot +802 -0
  350. data/doc/dot/f_7.jpg +0 -0
  351. data/doc/dot/f_8.dot +802 -0
  352. data/doc/dot/f_8.jpg +0 -0
  353. data/doc/dot/f_9.dot +802 -0
  354. data/doc/dot/f_9.jpg +0 -0
  355. data/doc/dot/m_10_0.dot +802 -0
  356. data/doc/dot/m_10_0.jpg +0 -0
  357. data/doc/dot/m_11_0.dot +734 -0
  358. data/doc/dot/m_11_0.jpg +0 -0
  359. data/doc/dot/m_12_0.dot +802 -0
  360. data/doc/dot/m_12_0.jpg +0 -0
  361. data/doc/dot/m_13_0.dot +802 -0
  362. data/doc/dot/m_13_0.jpg +0 -0
  363. data/doc/dot/m_14_0.dot +802 -0
  364. data/doc/dot/m_14_0.jpg +0 -0
  365. data/doc/dot/m_15_0.dot +802 -0
  366. data/doc/dot/m_15_0.jpg +0 -0
  367. data/doc/dot/m_16_0.dot +802 -0
  368. data/doc/dot/m_16_0.jpg +0 -0
  369. data/doc/dot/m_17_0.dot +802 -0
  370. data/doc/dot/m_17_0.jpg +0 -0
  371. data/doc/dot/m_18_0.dot +734 -0
  372. data/doc/dot/m_18_0.jpg +0 -0
  373. data/doc/dot/m_19_0.dot +802 -0
  374. data/doc/dot/m_19_0.jpg +0 -0
  375. data/doc/dot/m_20_0.dot +802 -0
  376. data/doc/dot/m_20_0.jpg +0 -0
  377. data/doc/dot/m_21_0.dot +802 -0
  378. data/doc/dot/m_21_0.jpg +0 -0
  379. data/doc/dot/m_22_0.dot +802 -0
  380. data/doc/dot/m_22_0.jpg +0 -0
  381. data/doc/dot/m_23_0.dot +802 -0
  382. data/doc/dot/m_23_0.jpg +0 -0
  383. data/doc/dot/m_24_0.dot +802 -0
  384. data/doc/dot/m_24_0.jpg +0 -0
  385. data/doc/dot/m_25_0.dot +802 -0
  386. data/doc/dot/m_25_0.jpg +0 -0
  387. data/doc/dot/m_26_0.dot +734 -0
  388. data/doc/dot/m_26_0.jpg +0 -0
  389. data/doc/dot/m_27_0.dot +802 -0
  390. data/doc/dot/m_27_0.jpg +0 -0
  391. data/doc/dot/m_28_0.dot +802 -0
  392. data/doc/dot/m_28_0.jpg +0 -0
  393. data/doc/dot/m_29_0.dot +802 -0
  394. data/doc/dot/m_29_0.jpg +0 -0
  395. data/doc/dot/m_30_0.dot +802 -0
  396. data/doc/dot/m_30_0.jpg +0 -0
  397. data/doc/dot/m_31_0.dot +802 -0
  398. data/doc/dot/m_31_0.jpg +0 -0
  399. data/doc/dot/m_32_0.dot +802 -0
  400. data/doc/dot/m_32_0.jpg +0 -0
  401. data/doc/dot/m_33_0.dot +802 -0
  402. data/doc/dot/m_33_0.jpg +0 -0
  403. data/doc/dot/m_34_0.dot +802 -0
  404. data/doc/dot/m_34_0.jpg +0 -0
  405. data/doc/dot/m_35_0.dot +802 -0
  406. data/doc/dot/m_35_0.jpg +0 -0
  407. data/doc/dot/m_36_0.dot +802 -0
  408. data/doc/dot/m_36_0.jpg +0 -0
  409. data/doc/dot/m_37_0.dot +802 -0
  410. data/doc/dot/m_37_0.jpg +0 -0
  411. data/doc/dot/m_38_0.dot +54 -0
  412. data/doc/dot/m_38_0.jpg +0 -0
  413. data/doc/dot/m_39_0.dot +802 -0
  414. data/doc/dot/m_39_0.jpg +0 -0
  415. data/doc/dot/m_40_0.dot +802 -0
  416. data/doc/dot/m_40_0.jpg +0 -0
  417. data/doc/dot/m_41_0.dot +802 -0
  418. data/doc/dot/m_41_0.jpg +0 -0
  419. data/doc/dot/m_42_0.dot +802 -0
  420. data/doc/dot/m_42_0.jpg +0 -0
  421. data/doc/dot/m_43_0.dot +802 -0
  422. data/doc/dot/m_43_0.jpg +0 -0
  423. data/doc/dot/m_44_0.dot +802 -0
  424. data/doc/dot/m_44_0.jpg +0 -0
  425. data/doc/dot/m_4_0.dot +802 -0
  426. data/doc/dot/m_4_0.jpg +0 -0
  427. data/doc/dot/m_5_0.dot +802 -0
  428. data/doc/dot/m_5_0.jpg +0 -0
  429. data/doc/dot/m_6_0.dot +802 -0
  430. data/doc/dot/m_6_0.jpg +0 -0
  431. data/doc/dot/m_7_0.dot +802 -0
  432. data/doc/dot/m_7_0.jpg +0 -0
  433. data/doc/dot/m_8_0.dot +802 -0
  434. data/doc/dot/m_8_0.jpg +0 -0
  435. data/doc/dot/m_9_0.dot +802 -0
  436. data/doc/dot/m_9_0.jpg +0 -0
  437. data/doc/files/DEPENDS.html +107 -0
  438. data/doc/files/HISTORY.html +316 -0
  439. data/doc/files/INSTALL.html +126 -0
  440. data/doc/files/README.html +1223 -0
  441. data/doc/files/TODO.html +148 -0
  442. data/doc/files/TUTORIAL.html +392 -0
  443. data/doc/files/VERSION.html +107 -0
  444. data/doc/files/bin/rq_rb.html +231 -0
  445. data/doc/files/install_rb.html +188 -0
  446. data/doc/files/install_rb.src/M000001.html +53 -0
  447. data/doc/files/install_rb.src/M000002.html +43 -0
  448. data/doc/files/lib/rq-1_0_0/backer_rb.html +174 -0
  449. data/doc/files/lib/rq-1_0_0/configfile_rb.html +174 -0
  450. data/doc/files/lib/rq-1_0_0/configurator_rb.html +174 -0
  451. data/doc/files/lib/rq-1_0_0/creator_rb.html +174 -0
  452. data/doc/files/lib/rq-1_0_0/defaultconfig_txt.html +110 -0
  453. data/doc/files/lib/rq-1_0_0/deleter_rb.html +174 -0
  454. data/doc/files/lib/rq-1_0_0/executor_rb.html +174 -0
  455. data/doc/files/lib/rq-1_0_0/feeder_rb.html +178 -0
  456. data/doc/files/lib/rq-1_0_0/job_rb.html +176 -0
  457. data/doc/files/lib/rq-1_0_0/jobqueue_rb.html +177 -0
  458. data/doc/files/lib/rq-1_0_0/jobrunner_rb.html +175 -0
  459. data/doc/files/lib/rq-1_0_0/jobrunnerdaemon_rb.html +179 -0
  460. data/doc/files/lib/rq-1_0_0/lister_rb.html +174 -0
  461. data/doc/files/lib/rq-1_0_0/locker_rb.html +175 -0
  462. data/doc/files/lib/rq-1_0_0/logging_rb.html +178 -0
  463. data/doc/files/lib/rq-1_0_0/mainhelper_rb.html +175 -0
  464. data/doc/files/lib/rq-1_0_0/qdb_rb.html +177 -0
  465. data/doc/files/lib/rq-1_0_0/querier_rb.html +174 -0
  466. data/doc/files/lib/rq-1_0_0/refresher_rb.html +167 -0
  467. data/doc/files/lib/rq-1_0_0/relayer_rb.html +178 -0
  468. data/doc/files/lib/rq-1_0_0/sleepcycle_rb.html +167 -0
  469. data/doc/files/lib/rq-1_0_0/snapshotter_rb.html +174 -0
  470. data/doc/files/lib/rq-1_0_0/statuslister_rb.html +174 -0
  471. data/doc/files/lib/rq-1_0_0/submitter_rb.html +174 -0
  472. data/doc/files/lib/rq-1_0_0/updater_rb.html +174 -0
  473. data/doc/files/lib/rq-1_0_0/usage_rb.html +174 -0
  474. data/doc/files/lib/rq-1_0_0/util_rb.html +176 -0
  475. data/doc/files/lib/rq-2_0_0/backer_rb.html +180 -0
  476. data/doc/files/lib/rq-2_0_0/configfile_rb.html +180 -0
  477. data/doc/files/lib/rq-2_0_0/configurator_rb.html +180 -0
  478. data/doc/files/lib/rq-2_0_0/creator_rb.html +180 -0
  479. data/doc/files/lib/rq-2_0_0/defaultconfig_txt.html +110 -0
  480. data/doc/files/lib/rq-2_0_0/deleter_rb.html +180 -0
  481. data/doc/files/lib/rq-2_0_0/executor_rb.html +180 -0
  482. data/doc/files/lib/rq-2_0_0/feeder_rb.html +184 -0
  483. data/doc/files/lib/rq-2_0_0/job_rb.html +182 -0
  484. data/doc/files/lib/rq-2_0_0/jobqueue_rb.html +185 -0
  485. data/doc/files/lib/rq-2_0_0/jobrunner_rb.html +181 -0
  486. data/doc/files/lib/rq-2_0_0/jobrunnerdaemon_rb.html +185 -0
  487. data/doc/files/lib/rq-2_0_0/lister_rb.html +180 -0
  488. data/doc/files/lib/rq-2_0_0/locker_rb.html +181 -0
  489. data/doc/files/lib/rq-2_0_0/logging_rb.html +184 -0
  490. data/doc/files/lib/rq-2_0_0/mainhelper_rb.html +181 -0
  491. data/doc/files/lib/rq-2_0_0/orderedautohash_rb.html +182 -0
  492. data/doc/files/lib/rq-2_0_0/orderedhash_rb.html +138 -0
  493. data/doc/files/lib/rq-2_0_0/qdb_rb.html +184 -0
  494. data/doc/files/lib/rq-2_0_0/querier_rb.html +180 -0
  495. data/doc/files/lib/rq-2_0_0/refresher_rb.html +173 -0
  496. data/doc/files/lib/rq-2_0_0/relayer_rb.html +184 -0
  497. data/doc/files/lib/rq-2_0_0/rotater_rb.html +180 -0
  498. data/doc/files/lib/rq-2_0_0/sleepcycle_rb.html +173 -0
  499. data/doc/files/lib/rq-2_0_0/snapshotter_rb.html +180 -0
  500. data/doc/files/lib/rq-2_0_0/statuslister_rb.html +180 -0
  501. data/doc/files/lib/rq-2_0_0/submitter_rb.html +181 -0
  502. data/doc/files/lib/rq-2_0_0/updater_rb.html +180 -0
  503. data/doc/files/lib/rq-2_0_0/usage_rb.html +180 -0
  504. data/doc/files/lib/rq-2_0_0/util_rb.html +182 -0
  505. data/doc/files/lib/rq-2_3_1/backer_rb.html +182 -0
  506. data/doc/files/lib/rq-2_3_1/configfile_rb.html +182 -0
  507. data/doc/files/lib/rq-2_3_1/configurator_rb.html +182 -0
  508. data/doc/files/lib/rq-2_3_1/creator_rb.html +182 -0
  509. data/doc/files/lib/rq-2_3_1/defaultconfig_txt.html +110 -0
  510. data/doc/files/lib/rq-2_3_1/deleter_rb.html +182 -0
  511. data/doc/files/lib/rq-2_3_1/executor_rb.html +182 -0
  512. data/doc/files/lib/rq-2_3_1/feeder_rb.html +187 -0
  513. data/doc/files/lib/rq-2_3_1/job_rb.html +185 -0
  514. data/doc/files/lib/rq-2_3_1/jobqueue_rb.html +187 -0
  515. data/doc/files/lib/rq-2_3_1/jobrunner_rb.html +184 -0
  516. data/doc/files/lib/rq-2_3_1/jobrunnerdaemon_rb.html +187 -0
  517. data/doc/files/lib/rq-2_3_1/lister_rb.html +182 -0
  518. data/doc/files/lib/rq-2_3_1/locker_rb.html +183 -0
  519. data/doc/files/lib/rq-2_3_1/logging_rb.html +186 -0
  520. data/doc/files/lib/rq-2_3_1/mainhelper_rb.html +183 -0
  521. data/doc/files/lib/rq-2_3_1/orderedautohash_rb.html +184 -0
  522. data/doc/files/lib/rq-2_3_1/orderedhash_rb.html +138 -0
  523. data/doc/files/lib/rq-2_3_1/qdb_rb.html +188 -0
  524. data/doc/files/lib/rq-2_3_1/querier_rb.html +182 -0
  525. data/doc/files/lib/rq-2_3_1/refresher_rb.html +175 -0
  526. data/doc/files/lib/rq-2_3_1/relayer_rb.html +186 -0
  527. data/doc/files/lib/rq-2_3_1/resubmitter_rb.html +183 -0
  528. data/doc/files/lib/rq-2_3_1/rotater_rb.html +182 -0
  529. data/doc/files/lib/rq-2_3_1/sleepcycle_rb.html +175 -0
  530. data/doc/files/lib/rq-2_3_1/snapshotter_rb.html +182 -0
  531. data/doc/files/lib/rq-2_3_1/statuslister_rb.html +182 -0
  532. data/doc/files/lib/rq-2_3_1/submitter_rb.html +183 -0
  533. data/doc/files/lib/rq-2_3_1/updater_rb.html +182 -0
  534. data/doc/files/lib/rq-2_3_1/usage_rb.html +182 -0
  535. data/doc/files/lib/rq-2_3_1/util_rb.html +184 -0
  536. data/doc/files/lib/rq-2_3_1_rb.html +153 -0
  537. data/doc/files/lib/rq-2_3_2/backer_rb.html +186 -0
  538. data/doc/files/lib/rq-2_3_2/configfile_rb.html +186 -0
  539. data/doc/files/lib/rq-2_3_2/configurator_rb.html +186 -0
  540. data/doc/files/lib/rq-2_3_2/creator_rb.html +186 -0
  541. data/doc/files/lib/rq-2_3_2/defaultconfig_txt.html +110 -0
  542. data/doc/files/lib/rq-2_3_2/deleter_rb.html +186 -0
  543. data/doc/files/lib/rq-2_3_2/executor_rb.html +186 -0
  544. data/doc/files/lib/rq-2_3_2/feeder_rb.html +191 -0
  545. data/doc/files/lib/rq-2_3_2/ioviewer_rb.html +186 -0
  546. data/doc/files/lib/rq-2_3_2/job_rb.html +189 -0
  547. data/doc/files/lib/rq-2_3_2/jobqueue_rb.html +192 -0
  548. data/doc/files/lib/rq-2_3_2/jobrunner_rb.html +188 -0
  549. data/doc/files/lib/rq-2_3_2/jobrunnerdaemon_rb.html +191 -0
  550. data/doc/files/lib/rq-2_3_2/lister_rb.html +186 -0
  551. data/doc/files/lib/rq-2_3_2/locker_rb.html +187 -0
  552. data/doc/files/lib/rq-2_3_2/logging_rb.html +190 -0
  553. data/doc/files/lib/rq-2_3_2/mainhelper_rb.html +188 -0
  554. data/doc/files/lib/rq-2_3_2/orderedautohash_rb.html +188 -0
  555. data/doc/files/lib/rq-2_3_2/orderedhash_rb.html +138 -0
  556. data/doc/files/lib/rq-2_3_2/qdb_rb.html +193 -0
  557. data/doc/files/lib/rq-2_3_2/querier_rb.html +186 -0
  558. data/doc/files/lib/rq-2_3_2/recoverer_rb.html +186 -0
  559. data/doc/files/lib/rq-2_3_2/refresher_rb.html +179 -0
  560. data/doc/files/lib/rq-2_3_2/relayer_rb.html +190 -0
  561. data/doc/files/lib/rq-2_3_2/resubmitter_rb.html +187 -0
  562. data/doc/files/lib/rq-2_3_2/rotater_rb.html +186 -0
  563. data/doc/files/lib/rq-2_3_2/sleepcycle_rb.html +179 -0
  564. data/doc/files/lib/rq-2_3_2/snapshotter_rb.html +186 -0
  565. data/doc/files/lib/rq-2_3_2/statuslister_rb.html +186 -0
  566. data/doc/files/lib/rq-2_3_2/submitter_rb.html +187 -0
  567. data/doc/files/lib/rq-2_3_2/updater_rb.html +186 -0
  568. data/doc/files/lib/rq-2_3_2/usage_rb.html +186 -0
  569. data/doc/files/lib/rq-2_3_2/util_rb.html +188 -0
  570. data/doc/files/lib/rq-2_3_3/backer_rb.html +186 -0
  571. data/doc/files/lib/rq-2_3_3/configfile_rb.html +186 -0
  572. data/doc/files/lib/rq-2_3_3/configurator_rb.html +186 -0
  573. data/doc/files/lib/rq-2_3_3/creator_rb.html +186 -0
  574. data/doc/files/lib/rq-2_3_3/defaultconfig_txt.html +110 -0
  575. data/doc/files/lib/rq-2_3_3/deleter_rb.html +186 -0
  576. data/doc/files/lib/rq-2_3_3/executor_rb.html +186 -0
  577. data/doc/files/lib/rq-2_3_3/feeder_rb.html +191 -0
  578. data/doc/files/lib/rq-2_3_3/ioviewer_rb.html +186 -0
  579. data/doc/files/lib/rq-2_3_3/job_rb.html +189 -0
  580. data/doc/files/lib/rq-2_3_3/jobqueue_rb.html +192 -0
  581. data/doc/files/lib/rq-2_3_3/jobrunner_rb.html +188 -0
  582. data/doc/files/lib/rq-2_3_3/jobrunnerdaemon_rb.html +191 -0
  583. data/doc/files/lib/rq-2_3_3/lister_rb.html +186 -0
  584. data/doc/files/lib/rq-2_3_3/locker_rb.html +187 -0
  585. data/doc/files/lib/rq-2_3_3/logging_rb.html +190 -0
  586. data/doc/files/lib/rq-2_3_3/mainhelper_rb.html +188 -0
  587. data/doc/files/lib/rq-2_3_3/orderedautohash_rb.html +188 -0
  588. data/doc/files/lib/rq-2_3_3/orderedhash_rb.html +138 -0
  589. data/doc/files/lib/rq-2_3_3/qdb_rb.html +193 -0
  590. data/doc/files/lib/rq-2_3_3/querier_rb.html +186 -0
  591. data/doc/files/lib/rq-2_3_3/recoverer_rb.html +186 -0
  592. data/doc/files/lib/rq-2_3_3/refresher_rb.html +179 -0
  593. data/doc/files/lib/rq-2_3_3/relayer_rb.html +190 -0
  594. data/doc/files/lib/rq-2_3_3/resubmitter_rb.html +187 -0
  595. data/doc/files/lib/rq-2_3_3/rotater_rb.html +187 -0
  596. data/doc/files/lib/rq-2_3_3/sleepcycle_rb.html +179 -0
  597. data/doc/files/lib/rq-2_3_3/snapshotter_rb.html +186 -0
  598. data/doc/files/lib/rq-2_3_3/statuslister_rb.html +186 -0
  599. data/doc/files/lib/rq-2_3_3/submitter_rb.html +187 -0
  600. data/doc/files/lib/rq-2_3_3/updater_rb.html +186 -0
  601. data/doc/files/lib/rq-2_3_3/usage_rb.html +186 -0
  602. data/doc/files/lib/rq-2_3_3/util_rb.html +188 -0
  603. data/doc/files/lib/rq-3_0_0/backer_rb.html +194 -0
  604. data/doc/files/lib/rq-3_0_0/configfile_rb.html +194 -0
  605. data/doc/files/lib/rq-3_0_0/configurator_rb.html +194 -0
  606. data/doc/files/lib/rq-3_0_0/creator_rb.html +194 -0
  607. data/doc/files/lib/rq-3_0_0/cron_rb.html +194 -0
  608. data/doc/files/lib/rq-3_0_0/defaultconfig_txt.html +110 -0
  609. data/doc/files/lib/rq-3_0_0/deleter_rb.html +194 -0
  610. data/doc/files/lib/rq-3_0_0/executor_rb.html +194 -0
  611. data/doc/files/lib/rq-3_0_0/feeder_rb.html +199 -0
  612. data/doc/files/lib/rq-3_0_0/ioviewer_rb.html +194 -0
  613. data/doc/files/lib/rq-3_0_0/job_rb.html +197 -0
  614. data/doc/files/lib/rq-3_0_0/jobqueue_rb.html +200 -0
  615. data/doc/files/lib/rq-3_0_0/jobrunner_rb.html +196 -0
  616. data/doc/files/lib/rq-3_0_0/jobrunnerdaemon_rb.html +199 -0
  617. data/doc/files/lib/rq-3_0_0/lister_rb.html +194 -0
  618. data/doc/files/lib/rq-3_0_0/locker_rb.html +195 -0
  619. data/doc/files/lib/rq-3_0_0/logging_rb.html +198 -0
  620. data/doc/files/lib/rq-3_0_0/mainhelper_rb.html +196 -0
  621. data/doc/files/lib/rq-3_0_0/orderedautohash_rb.html +196 -0
  622. data/doc/files/lib/rq-3_0_0/orderedhash_rb.html +138 -0
  623. data/doc/files/lib/rq-3_0_0/qdb_rb.html +201 -0
  624. data/doc/files/lib/rq-3_0_0/querier_rb.html +194 -0
  625. data/doc/files/lib/rq-3_0_0/recoverer_rb.html +194 -0
  626. data/doc/files/lib/rq-3_0_0/refresher_rb.html +187 -0
  627. data/doc/files/lib/rq-3_0_0/relayer_rb.html +198 -0
  628. data/doc/files/lib/rq-3_0_0/resource_rb.html +194 -0
  629. data/doc/files/lib/rq-3_0_0/resourcemanager_rb.html +187 -0
  630. data/doc/files/lib/rq-3_0_0/resubmitter_rb.html +195 -0
  631. data/doc/files/lib/rq-3_0_0/rotater_rb.html +195 -0
  632. data/doc/files/lib/rq-3_0_0/sleepcycle_rb.html +187 -0
  633. data/doc/files/lib/rq-3_0_0/snapshotter_rb.html +194 -0
  634. data/doc/files/lib/rq-3_0_0/sqlite_rb.html +160 -0
  635. data/doc/files/lib/rq-3_0_0/statuslister_rb.html +194 -0
  636. data/doc/files/lib/rq-3_0_0/submitter_rb.html +195 -0
  637. data/doc/files/lib/rq-3_0_0/toucher_rb.html +195 -0
  638. data/doc/files/lib/rq-3_0_0/updater_rb.html +194 -0
  639. data/doc/files/lib/rq-3_0_0/usage_rb.html +194 -0
  640. data/doc/files/lib/rq-3_0_0/util_rb.html +196 -0
  641. data/doc/files/lib/rq_rb.html +244 -0
  642. data/doc/fr_class_index.html +73 -0
  643. data/doc/fr_file_index.html +71 -0
  644. data/doc/fr_method_index.html +323 -0
  645. data/doc/index.html +24 -0
  646. data/doc/rdoc-style.css +172 -0
  647. data/extconf.rb +150 -0
  648. data/gemspec.rb +32 -0
  649. data/install.rb +75 -8
  650. data/lib/{rq-0.1.7.rb → rq-3.0.0.rb} +52 -10
  651. data/lib/{rq-0.1.7 → rq-3.0.0}/backer.rb +11 -7
  652. data/lib/{rq-0.1.7 → rq-3.0.0}/configfile.rb +21 -17
  653. data/lib/{rq-0.1.7 → rq-3.0.0}/configurator.rb +10 -6
  654. data/lib/rq-3.0.0/creator.rb +46 -0
  655. data/lib/rq-3.0.0/cron.rb +125 -0
  656. data/lib/{rq-0.1.7 → rq-3.0.0}/defaultconfig.txt +0 -0
  657. data/lib/rq-3.0.0/deleter.rb +51 -0
  658. data/lib/rq-3.0.0/executor.rb +40 -0
  659. data/lib/{rq-0.1.7 → rq-3.0.0}/feeder.rb +245 -91
  660. data/lib/rq-3.0.0/i686-linux/_sqlite.so +0 -0
  661. data/lib/rq-3.0.0/ioviewer.rb +48 -0
  662. data/lib/rq-3.0.0/job.rb +51 -0
  663. data/lib/rq-3.0.0/jobqueue.rb +899 -0
  664. data/lib/rq-3.0.0/jobrunner.rb +104 -0
  665. data/lib/{rq-0.1.7 → rq-3.0.0}/jobrunnerdaemon.rb +41 -27
  666. data/lib/rq-3.0.0/lister.rb +47 -0
  667. data/lib/rq-3.0.0/local/bin/sqlite +0 -0
  668. data/lib/rq-3.0.0/local/include/sqlite.h +868 -0
  669. data/lib/rq-3.0.0/local/lib/libsqlite.a +0 -0
  670. data/lib/rq-3.0.0/local/lib/libsqlite.la +35 -0
  671. data/lib/rq-3.0.0/local/lib/libsqlite.so +0 -0
  672. data/lib/rq-3.0.0/local/lib/libsqlite.so.0 +0 -0
  673. data/lib/rq-3.0.0/local/lib/libsqlite.so.0.8.6 +0 -0
  674. data/lib/rq-3.0.0/local/lib/pkgconfig/sqlite.pc +12 -0
  675. data/lib/{rq-0.1.7 → rq-3.0.0}/locker.rb +12 -6
  676. data/lib/{rq-0.1.7 → rq-3.0.0}/logging.rb +49 -42
  677. data/lib/rq-3.0.0/mainhelper.rb +184 -0
  678. data/lib/rq-3.0.0/orderedautohash.rb +39 -0
  679. data/lib/rq-3.0.0/orderedhash.rb +240 -0
  680. data/lib/{rq-0.1.7 → rq-3.0.0}/qdb.rb +183 -84
  681. data/lib/rq-3.0.0/querier.rb +98 -0
  682. data/lib/rq-3.0.0/recoverer.rb +28 -0
  683. data/lib/{rq-0.1.7 → rq-3.0.0}/refresher.rb +16 -8
  684. data/lib/rq-3.0.0/relayer.rb +283 -0
  685. data/lib/rq-3.0.0/resource.rb +22 -0
  686. data/lib/rq-3.0.0/resourcemanager.rb +40 -0
  687. data/lib/rq-3.0.0/resubmitter.rb +96 -0
  688. data/lib/rq-3.0.0/rotater.rb +98 -0
  689. data/lib/{rq-0.1.7 → rq-3.0.0}/sleepcycle.rb +14 -14
  690. data/lib/rq-3.0.0/snapshotter.rb +40 -0
  691. data/lib/rq-3.0.0/sqlite.rb +293 -0
  692. data/lib/rq-3.0.0/statuslister.rb +48 -0
  693. data/lib/rq-3.0.0/submitter.rb +109 -0
  694. data/lib/rq-3.0.0/toucher.rb +177 -0
  695. data/lib/rq-3.0.0/updater.rb +95 -0
  696. data/lib/rq-3.0.0/usage.rb +1157 -0
  697. data/lib/{rq-0.1.7 → rq-3.0.0}/util.rb +74 -56
  698. data/lib/rq.rb +52 -12
  699. data/rdoc.sh +17 -0
  700. data/rq +3 -1
  701. data/white_box/joblist +8 -0
  702. metadata +779 -96
  703. data/DEPENDS +0 -5
  704. data/HISTORY +0 -26
  705. data/VERSION +0 -1
  706. data/bin/rq-0.1.7 +0 -410
  707. data/lib/rq-0.1.7/creator.rb +0 -23
  708. data/lib/rq-0.1.7/deleter.rb +0 -39
  709. data/lib/rq-0.1.7/executor.rb +0 -41
  710. data/lib/rq-0.1.7/job.rb +0 -51
  711. data/lib/rq-0.1.7/jobqueue.rb +0 -432
  712. data/lib/rq-0.1.7/jobrunner.rb +0 -63
  713. data/lib/rq-0.1.7/lister.rb +0 -22
  714. data/lib/rq-0.1.7/mainhelper.rb +0 -53
  715. data/lib/rq-0.1.7/querier.rb +0 -33
  716. data/lib/rq-0.1.7/snapshotter.rb +0 -25
  717. data/lib/rq-0.1.7/statuslister.rb +0 -22
  718. data/lib/rq-0.1.7/submitter.rb +0 -90
  719. data/lib/rq-0.1.7/updater.rb +0 -95
  720. data/lib/rq-0.1.7/usage.rb +0 -609
  721. data/rdoc.cmd +0 -2
  722. data/rq.gemspec +0 -36
  723. data/rq.help +0 -552
@@ -0,0 +1,48 @@
1
+ unless defined? $__rq_statuslister__
2
+ module RQ
3
+ #--{{{
4
+ LIBDIR = File::dirname(File::expand_path(__FILE__)) + File::SEPARATOR unless
5
+ defined? LIBDIR
6
+
7
+ require LIBDIR + 'mainhelper'
8
+
9
+ #
10
+ # the StatusLister class dumps a yaml report on stdout showing how many jobs
11
+ # are in each of the states
12
+ # * pending
13
+ # * holding
14
+ # * running
15
+ # * finished
16
+ # * dead
17
+ #
18
+ class StatusLister < MainHelper
19
+ #--{{{
20
+ def statuslist
21
+ #--{{{
22
+ set_q
23
+ exit_code_map = parse_exit_code_map @options['exit']
24
+ puts @q.status('exit_code_map' => exit_code_map).to_yaml
25
+ #--}}}
26
+ end
27
+ def parse_exit_code_map emap = 'ok=42'
28
+ emap ||= 'ok=42'
29
+ map = {}
30
+ begin
31
+ tokens = emap.strip.gsub(%r/\s+/, ' ').gsub(%r/\s*=\s*/, '=').split
32
+ tokens.each do |token|
33
+ key, *values = token.split %r/[=,]/
34
+ values.map!{|value| Integer value}
35
+ map[key.to_s] = values
36
+ end
37
+ rescue => e
38
+ warn{ e }
39
+ raise "bad map <#{ emap }"
40
+ end
41
+ map
42
+ end
43
+ #--}}}
44
+ end # class StatusLister
45
+ #--}}}
46
+ end # module RQ
47
+ $__rq_statuslister__ = __FILE__
48
+ end
@@ -0,0 +1,109 @@
1
+ unless defined? $__rq_submitter__
2
+ module RQ
3
+ #--{{{
4
+ LIBDIR = File::dirname(File::expand_path(__FILE__)) + File::SEPARATOR unless
5
+ defined? LIBDIR
6
+
7
+ require LIBDIR + 'mainhelper'
8
+ require LIBDIR + 'job'
9
+
10
+ #
11
+ # the Submitter class is responsible for submitting commands to the queue,
12
+ # the commands it submits are taken from the command line, stdin, or the
13
+ # specified infile. the format of commands read from stdin or file is
14
+ # either a simple list of commands, one per line, where blank lines are
15
+ # ignored OR it is valid yaml input. if the Submitter sees the token
16
+ # '---' in the input stream it is assumed the input is yaml. for an
17
+ # example of valid yaml input examine the output of a Lister using
18
+ #
19
+ # rq q list
20
+ #
21
+ # the output of other commands, such as that of a Querier may also be used
22
+ # as input to submit
23
+ #
24
+ class Submitter < MainHelper
25
+ #--{{{
26
+ def submit
27
+ #--{{{
28
+ set_q
29
+
30
+ @priority = @options['priority']
31
+ debug{ "priority <#{ @priority }>" }
32
+
33
+ @tag = @options['tag']
34
+ debug{ "tag <#{ @tag }>" }
35
+
36
+ @runner = @options['runner']
37
+ debug{ "runner <#{ @runner }>" }
38
+
39
+ @restartable = @options['restartable']
40
+ debug{ "restartable <#{ @restartable }>" }
41
+
42
+ @infile = @options['infile']
43
+ debug{ "infile <#{ @infile }>" }
44
+
45
+ @job_stdin = @options['stdin']
46
+ debug{ "job_stdin <#{ @job_stdin }>" }
47
+
48
+ @stage = @options['stage']
49
+ debug{ "stage <#{ @stage }>" }
50
+
51
+ if job_stdin == '-' and stdin?
52
+ abort "cannot specify both jobs and job input on stdin"
53
+ end
54
+
55
+ jobs = []
56
+
57
+ unless @argv.empty?
58
+ job = Job::new
59
+ job['command'] = @argv.join(' ')
60
+ job['priority'] = @priority
61
+ job['tag'] = @tag
62
+ job['runner'] = @runner
63
+ job['restartable'] = @restartable
64
+ jobs << job
65
+ end
66
+
67
+ if @infile
68
+ open(@infile) do |f|
69
+ debug{ "reading jobs from <#{ @infile }>" }
70
+ loadio f, @infile, jobs
71
+ end
72
+ end
73
+
74
+ if jobs.empty? and stdin?
75
+ debug{ "reading jobs from <stdin>" }
76
+ loadio stdin, 'stdin', jobs
77
+ end
78
+
79
+ abort "no jobs specified!" if jobs.empty?
80
+
81
+ init_job_stdin!
82
+
83
+ state = @stage ? 'holding' : 'pending'
84
+
85
+ jobs.each do |job|
86
+ job['state'] = state
87
+ job['priority'] = @priority if @options.has_key?('priority')
88
+ job['tag'] = @tag if @options.has_key?('tag')
89
+ job['runner'] = @runner if @options.has_key?('runner')
90
+ job['restartable'] = @restartable if @options.has_key?('restartable')
91
+ job['stdin'] = @job_stdin if @job_stdin
92
+ end
93
+
94
+ if @options['quiet']
95
+ @q.submit(*jobs)
96
+ else
97
+ @q.submit(*jobs, &dumping_yaml_tuples)
98
+ end
99
+
100
+ jobs = nil
101
+ self
102
+ #--}}}
103
+ end
104
+ #--}}}
105
+ end # class Submitter
106
+ #--}}}
107
+ end # module RQ
108
+ $__rq_submitter__ = __FILE__
109
+ end
@@ -0,0 +1,177 @@
1
+ unless defined? $__rq_toucher__
2
+ module RQ
3
+ #--{{{
4
+ LIBDIR = File::dirname(File::expand_path(__FILE__)) + File::SEPARATOR unless
5
+ defined? LIBDIR
6
+
7
+ require LIBDIR + 'mainhelper'
8
+ require LIBDIR + 'job'
9
+
10
+ #
11
+ # nodoc
12
+ #
13
+ class Toucher < MainHelper
14
+ #--{{{
15
+ def touch
16
+ #--{{{
17
+ set_q
18
+
19
+ @priority = @options['priority']
20
+ debug{ "priority <#{ @priority }>" }
21
+
22
+ @tag = @options['tag']
23
+ debug{ "tag <#{ @tag }>" }
24
+
25
+ @runner = @options['runner']
26
+ debug{ "runner <#{ @runner }>" }
27
+
28
+ @restartable = @options['restartable']
29
+ debug{ "restartable <#{ @restartable }>" }
30
+
31
+ @infile = @options['infile']
32
+ debug{ "infile <#{ @infile }>" }
33
+
34
+ @job_stdin = @options['stdin']
35
+ debug{ "job_stdin <#{ @job_stdin }>" }
36
+
37
+ @stage = @options['stage']
38
+ debug{ "stage <#{ @stage }>" }
39
+
40
+ if job_stdin == '-' and stdin?
41
+ abort "cannot specify both jobs and job input on stdin"
42
+ end
43
+
44
+ jobs = []
45
+
46
+ unless @argv.empty?
47
+ job = Job::new
48
+ job['command'] = @argv.join(' ')
49
+ job['priority'] = @priority
50
+ job['tag'] = @tag
51
+ job['runner'] = @runner
52
+ job['restartable'] = @restartable
53
+ jobs << job
54
+ end
55
+
56
+ if @infile
57
+ open(@infile) do |f|
58
+ debug{ "reading jobs from <#{ @infile }>" }
59
+ loadio f, @infile, jobs
60
+ end
61
+ end
62
+
63
+ if jobs.empty? and stdin?
64
+ debug{ "reading jobs from <stdin>" }
65
+ loadio stdin, 'stdin', jobs
66
+ end
67
+
68
+ abort "no jobs specified!" if jobs.empty?
69
+
70
+ init_job_stdin!
71
+
72
+ state = @stage ? 'holding' : 'pending'
73
+
74
+ jobs.each do |job|
75
+ job['state'] = state
76
+ job['priority'] = @priority if @options.has_key?('priority')
77
+ job['tag'] = @tag if @options.has_key?('tag')
78
+ job['runner'] = @runner if @options.has_key?('runner')
79
+ job['restartable'] = @restartable if @options.has_key?('restartable')
80
+ job['stdin'] = @job_stdin if @job_stdin
81
+ end
82
+
83
+ #
84
+ # state + lambdas for submit process...
85
+ #
86
+
87
+ list = []
88
+
89
+ tmpfile =
90
+ lambda do |basename|
91
+ basename = File.basename basename.to_s
92
+ Tempfile.new "#{ basename }_#{ Process.pid }_#{ rand.to_s }"
93
+ end
94
+
95
+ update_job =
96
+ lambda do |pjob, ujob|
97
+ kvs, jid = {}, pjob['jid']
98
+ # handle stdin
99
+ pstdin, ustdin = pjob['stdin'], ujob['stdin']
100
+ if pstdin || ustdin
101
+ pbuf =
102
+ if pstdin
103
+ pstdin = @q.standard_in_4 jid
104
+ IO.read pstdin if test ?e, pstdin
105
+ end
106
+ ubuf =
107
+ if ustdin
108
+ IO.read ustdin if test ?e, ustdin
109
+ end
110
+ #y 'pbuf' => pbuf
111
+ #y 'ubuf' => ubuf
112
+ f = ustdin ? open(ustdin,'w') : tmpfile[ustdin]
113
+ begin
114
+ f.write pbuf if pbuf
115
+ f.write ubuf if pbuf
116
+ ensure
117
+ f.close
118
+ end
119
+ kvs['stdin'] = ujob['stdin'] = f.path
120
+ #y 'stdin' => ujob['stdin']
121
+ end
122
+ # handle other keys
123
+ allowed = %w( priority runner restartable )
124
+ allowed.each do |key|
125
+ val = ujob[key]
126
+ kvs[key] = val if val
127
+ end
128
+ @q.update(kvs, jid){|updated| list << updated}
129
+ end
130
+
131
+ submit_job =
132
+ lambda do |job|
133
+ @q.submit(job){|submitted| list << submitted}
134
+ end
135
+
136
+
137
+ #
138
+ # update or submit
139
+ #
140
+ @q.transaction do
141
+ pending = @q.list 'pending'
142
+
143
+ pjobs, pcommands = {}, {}
144
+
145
+ pending.each do |job|
146
+ jid = job['jid']
147
+ command = job['command'].strip
148
+ tag = job['tag'].to_s.strip
149
+ pjobs[jid] = job
150
+ pcommands[[command, tag]] = jid
151
+ end
152
+
153
+ jobs.each do |job|
154
+ jid = job['jid']
155
+ command = job['command'].strip
156
+ tag = job['tag'].to_s.strip
157
+ if((jid = pcommands[[command, tag]]))
158
+ update_job[ pjobs[jid], job ]
159
+ else
160
+ submit_job[ job ]
161
+ end
162
+ end
163
+ end
164
+
165
+ list.each &dumping_yaml_tuples unless @options['quiet']
166
+
167
+ jobs = nil
168
+ list = nil
169
+ self
170
+ #--}}}
171
+ end
172
+ #--}}}
173
+ end # class Toucher
174
+ #--}}}
175
+ end # module RQ
176
+ $__rq_toucher__ = __FILE__
177
+ end
@@ -0,0 +1,95 @@
1
+ unless defined? $__rq_updater__
2
+ module RQ
3
+ #--{{{
4
+ LIBDIR = File::dirname(File::expand_path(__FILE__)) + File::SEPARATOR unless
5
+ defined? LIBDIR
6
+
7
+ require LIBDIR + 'mainhelper'
8
+
9
+ #
10
+ # the Updater class reads jids from the command line and then looks for
11
+ # key=value pairs on the command line, stdin, or from infile. the jids are
12
+ # taken to be jids to update with the key=values pairs scanned
13
+ #
14
+ class Updater < MainHelper
15
+ #--{{{
16
+ def update
17
+ #--{{{
18
+ set_q
19
+ jids = []
20
+ kvs = {}
21
+
22
+ kvs.update "stdin" => job_stdin if job_stdin?
23
+
24
+ #
25
+ # scan argv for jids to update
26
+ #
27
+ list, @argv = @argv.partition{|arg| arg =~ %r/^\s*(?:jid\s*=\s*)?\d+\s*$/}
28
+ list.each{|elem| jids << Integer(elem[%r/\d+/])}
29
+ list, @argv = @argv.partition{|arg| arg =~ %r/^\s*(?:p(?:ending)|h(?:olding))\s*$/}
30
+ list.each{|elem| jids << elem.strip.downcase}
31
+ #
32
+ # scan argv for key=val pairs
33
+ #
34
+ keyeqpat = %r/\s*([^\s=]+)\s*=\s*([^\s]*)\s*$/
35
+ list, @argv = @argv.partition{|arg| arg =~ keyeqpat}
36
+ list.each do |elem|
37
+ m = elem.match(keyeqpat)
38
+ k, v = m[1], m[2]
39
+ k = (k.empty? ? nil : k.strip)
40
+ v = (v.empty? ? nil : v.strip)
41
+ v =
42
+ case v
43
+ when %r/^\s*(?:nil|null?)\s*$/io
44
+ nil
45
+ else
46
+ v
47
+ end
48
+ kvs[k] = v
49
+ end
50
+ # STDERR.puts kvs.inspect
51
+
52
+ unless @argv.empty?
53
+ raise "don't know what to do with crap arguments <#{ @argv.join ' ' }>"
54
+ end
55
+
56
+ #
57
+ # scan stdin for jids to update iff in pipeline
58
+ #
59
+ if stdin?
60
+ #pat = %r/^(?:\s*jid\s*:)?\s*(\d+)\s*$/io
61
+ while((line = stdin.gets))
62
+ case line
63
+ when %r/^(?:\s*jid\s*:)?\s*(\d+)\s*$/io
64
+ jids << Integer($1)
65
+ when %r/^\s*p(?:ending)\s*$/io
66
+ jids << 'pending'
67
+ when %r/^\s*h(?:olding)\s*$/io
68
+ jids << 'holding'
69
+ else
70
+ next
71
+ end
72
+ end
73
+ end
74
+ #jids.map!{|jid| jid =~ %r/^\s*\d+\s*$/o ? Integer(jid) : jid}
75
+ #raise "no jids" if jids.empty?
76
+ #
77
+ # if no jids were specified simply update ALL pending and holding jobs
78
+ #
79
+ jids << 'pending' << 'holding' if jids.empty?
80
+ #
81
+ # apply the update
82
+ #
83
+ if @options['quiet']
84
+ @q.update(kvs,*jids)
85
+ else
86
+ @q.update(kvs,*jids, &dumping_yaml_tuples)
87
+ end
88
+ #--}}}
89
+ end
90
+ #--}}}
91
+ end # class Updater
92
+ #--}}}
93
+ end # module RQ
94
+ $__rq_updater__ = __FILE__
95
+ end
@@ -0,0 +1,1157 @@
1
+ unless defined? $__rq_usage__
2
+ module RQ
3
+ #--{{{
4
+ LIBDIR = File::dirname(File::expand_path(__FILE__)) + File::SEPARATOR unless
5
+ defined? LIBDIR
6
+
7
+ require LIBDIR + 'util'
8
+
9
+ #
10
+ # the reasons this is pulled off into it's own module are
11
+ # * it's really big
12
+ # * it totally wrecks vim's syntax highlighting
13
+ #
14
+ module Usage
15
+ #--{{{
16
+ def cget const
17
+ #--{{{
18
+ begin
19
+ klass::const_get const
20
+ rescue NameError
21
+ nil
22
+ end
23
+ #--}}}
24
+ end
25
+ def usage opts = {}
26
+ #--{{{
27
+ port = getopt 'port', opts
28
+ long = getopt 'long', opts
29
+
30
+ port = STDERR if port.nil?
31
+
32
+ if(long and (txt = cget 'USAGE'))
33
+ port << txt << "\n"
34
+ elsif((txt = cget 'USAGE_BANNER'))
35
+ port << txt << "\n"
36
+ else
37
+ port << "#{ $0 } [options]* [args]*" << "\n"
38
+ end
39
+
40
+ if((optspec = cget 'OPTSPEC'))
41
+ port << 'OPTIONS' << "\n"
42
+ optspec.each do |os|
43
+ a, b, c = os
44
+ long, short, desc = nil
45
+ [a,b,c].each do |word|
46
+ next unless word
47
+ word.strip!
48
+ case word
49
+ when %r/^--[^-]/o
50
+ long = word
51
+ when %r/^-[^-]/o
52
+ short = word
53
+ else
54
+ desc = word
55
+ end
56
+ end
57
+ spec = ((long and short) ? [long, short] : [long])
58
+ if spec
59
+ port << columnize(spec.join(', '), 80, 2)
60
+ port << "\n"
61
+ end
62
+ if desc
63
+ port << columnize(desc, 80, 8)
64
+ port << "\n"
65
+ end
66
+ end
67
+ port << "\n"
68
+ end
69
+
70
+ if((txt = cget 'EXAMPLES'))
71
+ port << txt << "\n"
72
+ end
73
+
74
+ port
75
+ #--}}}
76
+ end
77
+ module_function :usage
78
+ public :usage
79
+
80
+ PROGNAM = 'rq'
81
+
82
+ # :nodoc
83
+ USAGE_BANNER =
84
+ #--{{{
85
+ <<-usage_banner
86
+ NAME
87
+ rq v#{ VERSION }
88
+
89
+ SYNOPSIS
90
+ rq (queue | export RQ_Q=q) mode [mode_args]* [options]*
91
+ usage_banner
92
+ #--}}}
93
+
94
+ # :nodoc
95
+ USAGE =
96
+ #--{{{
97
+ <<-usage
98
+ #{ USAGE_BANNER }
99
+ URIS
100
+
101
+ http://codeforpeople.com/lib/ruby/rq/
102
+ http://raa.ruby-lang.org/project/rq/
103
+ http://www.linuxjournal.com/article/7922
104
+
105
+ DESCRIPTION
106
+
107
+ ruby queue (rq) is a zero-admin zero-configuration tool used to create instant
108
+ unix clusters. rq requires only a central nfs filesystem in order to manage a
109
+ simple sqlite database as a distributed priority work queue. this simple
110
+ design allows researchers with minimal unix experience to install and
111
+ configure, in only a few minutes and without root privileges, a robust unix
112
+ cluster capable of distributing processes to many nodes - bringing dozens of
113
+ powerful cpus to their knees with a single blow. clearly this software should
114
+ be kept out of the hands of free radicals, seti enthusiasts, and one mr. j
115
+ safran.
116
+
117
+ the central concept of rq is that n nodes work in isolation to pull jobs
118
+ from an centrally mounted nfs priority work queue in a synchronized fashion.
119
+ the nodes have absolutely no knowledge of each other and all communication
120
+ is done via the queue meaning that, so long as the queue is available via
121
+ nfs and a single node is running jobs from it, the system will continue to
122
+ process jobs. there is no centralized process whatsoever - all nodes work
123
+ to take jobs from the queue and run them as fast as possible. this creates
124
+ a system which load balances automatically and is robust in face of node
125
+ failures.
126
+
127
+ although the rq system is simple in it's design it features powerful
128
+ functionality such as priority management, predicate and sql query , compact
129
+ streaming command-line processing, programmable api, hot-backup, and
130
+ input/capture of the stdin/stdout/stderr io streams of remote jobs. to date
131
+ rq has had no reported runtime failures and is in operation at dozens of
132
+ research centers around the world.
133
+
134
+ INVOCATION
135
+
136
+ the first argument to any rq command is the always the name of the queue
137
+ while the second is the mode of operation. the queue name may be omitted
138
+ if, and only if, the environment variable RQ_Q has been set to contain the
139
+ absolute path of target queue.
140
+
141
+ for instance, the command
142
+
143
+ ~ > rq queue list
144
+
145
+ is equivalent to
146
+
147
+ ~ > export RQ_Q=queue
148
+ ~ > rq list
149
+
150
+ this facility can be used to create aliases for several queues, for example,
151
+ a .bashrc containing
152
+
153
+ alias MYQ="RQ_Q=/path/to/myq rq"
154
+
155
+ alias MYQ2="RQ_Q=/path/to/myq2 rq"
156
+
157
+ would allow syntax like
158
+
159
+ MYQ2 submit < joblist
160
+
161
+ MODES
162
+
163
+ rq operates in modes create, submit, resubmit, list, status, delete, update,
164
+ query, execute, configure, snapshot, lock, backup, rotate, feed, recover,
165
+ ioview, cron, help, and a few others. the meaning of 'mode_args' will
166
+ naturally change depending on the mode of operation.
167
+
168
+ the following mode abbreviations exist, note that not all modes have
169
+ abbreviations
170
+
171
+ c => create
172
+ s => submit
173
+ r => resubmit
174
+ l => list
175
+ ls => list
176
+ t => status
177
+ d => delete
178
+ rm => delete
179
+ u => update
180
+ q => query
181
+ e => execute
182
+ C => configure
183
+ S => snapshot
184
+ L => lock
185
+ b => backup
186
+ R => rotate
187
+ f => feed
188
+ io => ioview
189
+ 0 => stdin
190
+ 1 => stdout
191
+ 2 => stderr
192
+ h => help
193
+
194
+
195
+ create, c :
196
+
197
+ creates a queue. the queue must be located on an nfs mounted file system
198
+ visible from all nodes intended to run jobs from it. nfs locking must be
199
+ functional on this file system.
200
+
201
+ examples :
202
+
203
+ 0) to create a queue
204
+ ~ > rq /path/to/nfs/mounted/q create
205
+
206
+ or, using the abbreviation
207
+
208
+ ~ > rq /path/to/nfs/mounted/q c
209
+
210
+
211
+ submit, s :
212
+
213
+ submit jobs to a queue to be proccesed by some feeding node. any
214
+ 'mode_args' are taken as the command to run. note that 'mode_args' are
215
+ subject to shell expansion - if you don't understand what this means do
216
+ not use this feature and pass jobs on stdin.
217
+
218
+ when running in submit mode a file may by specified as a list of commands
219
+ to run using the '--infile, -i' option. this file is taken to be a
220
+ newline separated list of commands to submit, blank lines and comments (#)
221
+ are allowed. if submitting a large number of jobs the input file method
222
+ is MUCH, more efficient. if no commands are specified on the command line
223
+ rq automatically reads them from stdin. yaml formatted files are also
224
+ allowed as input (http://www.yaml.org/) - note that the output of nearly
225
+ all rq commands is valid yaml and may, therefore, be piped as input into
226
+ the submit command. the leading '---' of yaml file may not be omitted.
227
+
228
+ when submitting the '--priority, -p' option can be used here to determine
229
+ the priority of jobs. priorities may be any whole number including
230
+ negative ones - zero is the default. note that submission of a high
231
+ priority job will NOT supplant a currently running low priority job, but
232
+ higher priority jobs WILL always migrate above lower priority jobs in the
233
+ queue in order that they be run as soon as possible. constant submission
234
+ of high priority jobs may create a starvation situation whereby low
235
+ priority jobs are never allowed to run. avoiding this situation is the
236
+ responsibility of the user. the only guaruntee rq makes regarding job
237
+ execution is that jobs are executed in an 'oldest-highest-priority' order
238
+ and that running jobs are never supplanted. jobs submitted with the
239
+ '--stage' option will not be eligible to be run by any node and will
240
+ remain in a 'holding' state until updated (see update mode) into the
241
+ 'pending' mode, this option allows jobs to entered, or 'staged', in the
242
+ queue and then made candidates for running at a later date.
243
+
244
+ rq allows the stdin of commands to be provided and also captures the
245
+ stdout and stderr of any job run (of course standard shell redirects may
246
+ be used as well) and all three will be stored in a directory relative the
247
+ the queue itself. the stdin/stdout/stderr files are stored by job id and
248
+ there location (though relative to the queue) is shown in the output of
249
+ 'list' (see docs for list).
250
+
251
+
252
+ examples :
253
+
254
+ 0) submit the job ls to run on some feeding host
255
+
256
+ ~ > rq q s ls
257
+
258
+ 1) submit the job ls to run on some feeding host, at priority 9
259
+
260
+ ~ > rq -p9 q s ls
261
+
262
+ 2) submit a list of jobs from file. note the '-' used to specify
263
+ reading jobs from stdin
264
+
265
+ ~ > cat joblist
266
+ job1.sh
267
+ job2.sh
268
+ job2.sh
269
+
270
+ ~ > rq q submit --infile=joblist
271
+
272
+ 3) submit a joblist on stdin
273
+
274
+ ~ > cat joblist | rq q submit -
275
+
276
+ or
277
+
278
+ ~ > rq q submit - <joblist
279
+
280
+ 4) submit cat as a job, providing the stdin for cat from the file cat.in
281
+
282
+ ~ > rq q submit cat --stdin=cat.in
283
+
284
+ 5) submit cat as a job, providing the stdin for the cat job on stdin
285
+
286
+ ~ > cat cat.in | rq q submit cat --stdin=-
287
+
288
+ or
289
+
290
+ ~ > rq q submit cat --stdin=- <cat.in
291
+
292
+ 6) submit 42 priority 9 jobs from a command file, marking them as
293
+ 'important' using the '--tag, -t' option.
294
+
295
+ ~ > wc -l cmdfile
296
+ 42
297
+
298
+ ~ > rq -p9 -timportant q s < cmdfile
299
+
300
+ 6) re-submit all the 'important' jobs (see 'query' section below)
301
+
302
+ ~ > rq q query tag=important | rq q s -
303
+
304
+ 8) re-submit all jobs which are already finished (see 'list' section
305
+ below)
306
+
307
+ ~ > rq q l f | rq q s
308
+
309
+
310
+ 9) stage the job wont_run_yet to the queue in a 'holding' state. no
311
+ feeder will run this job until it's state is upgraded to 'pending'
312
+
313
+ ~ > rq q s --stage wont_run_yet
314
+
315
+
316
+ resubmit, r :
317
+
318
+ resubmit jobs back to a queue to be proccesed by a feeding node. resubmit
319
+ is essentially equivalent to submitting a job that is already in the queue
320
+ as a new job and then deleting the original job except that using resubmit
321
+ is atomic and, therefore, safer and more efficient. resubmission respects
322
+ any previous stdin provided for job input. read docs for delete and
323
+ submit for more info.
324
+
325
+ examples :
326
+
327
+ 0) resubmit job 42 to the queue
328
+
329
+ ~> rq q resubmit 42
330
+
331
+ 1) resubmit all failed jobs
332
+
333
+ ~> rq q query exit_status!=0 | rq q resubmit -
334
+
335
+ 2) resubmit job 4242 with different stdin
336
+
337
+ ~ rq q resubmit 4242 --stdin=new_stdin.in
338
+
339
+
340
+ list, l, ls :
341
+
342
+ list mode lists jobs of a certain state or job id. state may be one of
343
+ pending, holding, running, finished, dead, or all. any 'mode_args' that
344
+ are numbers are taken to be job id's to list.
345
+
346
+ states may be abbreviated to uniqueness, therefore the following shortcuts
347
+ apply :
348
+
349
+ p => pending
350
+ h => holding
351
+ r => running
352
+ f => finished
353
+ d => dead
354
+ a => all
355
+
356
+ examples :
357
+
358
+ 0) show everything in q
359
+ ~ > rq q list all
360
+
361
+ or
362
+
363
+ ~ > rq q l all
364
+
365
+ or
366
+
367
+ ~ > export RQ_Q=q
368
+ ~ > rq l
369
+
370
+ 1) show q's pending jobs
371
+ ~ > rq q list pending
372
+
373
+ 2) show q's running jobs
374
+ ~ > rq q list running
375
+
376
+ 3) show q's finished jobs
377
+ ~ > rq q list finished
378
+
379
+ 4) show job id 42
380
+ ~ > rq q l 42
381
+
382
+ 5) show q's holding jobs
383
+ ~ > rq q list holding
384
+
385
+
386
+ status, t :
387
+
388
+ status mode shows the global state the queue and statistics on it's the
389
+ cluster's performance. there are no 'mode_args'. the meaning of each
390
+ state is as follows:
391
+
392
+ pending => no feeder has yet taken this job
393
+ holding => a hold has been placed on this job, thus no feeder will start
394
+ it
395
+ running => a feeder has taken this job
396
+ finished => a feeder has finished this job
397
+ dead => rq died while running a job, has restarted, and moved
398
+ this job to the dead state
399
+
400
+ note that rq cannot move jobs into the dead state unless it has been
401
+ restarted. this is because no node has any knowledge of other nodes and
402
+ cannot possibly know if a job was started on a node that subsequently
403
+ died, or that it is simply taking a very long time to complete. only the
404
+ node that dies, upon restart, can determine that it owns jobs that 'were
405
+ started before it started running jobs', an impossibility, and move these
406
+ jobs into the dead state.
407
+
408
+ normally only a machine crash would cause a job to be placed into the dead
409
+ state. dead jobs are automatically restarted if, and only if, the job was
410
+ submitted with the '--restartable' flag.
411
+
412
+ status breaks down a variety of canned statistics about a nodes'
413
+ performance based solely on the jobs currently in the queue. only one
414
+ option affects the ouput: '--exit'. this option is used to specify
415
+ additionaly exit code mappings on which to report. normally rq will
416
+ report any job with an exit code of 0 as being 'successes' and any job
417
+ with an exit code that is not 0, or a status of 'dead', as being
418
+ 'failures'. if the '--exit' switch is used then additional mappings can
419
+ be specified, note that the the semantics for 'successes' and 'failures'
420
+ does not change - this keyword specifies extra mappings.
421
+
422
+ examples :
423
+
424
+ 0) show q's status
425
+
426
+ ~ > rq q t
427
+
428
+ 2) show q's status, consider any exit code of 42 will be listed as 'ok'
429
+
430
+ ~ > rq q t --exit ok=42
431
+
432
+ 3) show q's status, consider any exit code of 42 or 43 will be listed as
433
+ 'ok' and 127 will be listed as 'command_not_found'. notice the quoting
434
+ required.
435
+
436
+ ~ > rq q t --exit 'ok=42,43 command_not_found=127'
437
+
438
+
439
+ delete, d :
440
+
441
+ delete combinations of pending, holding, finished, dead, or jobs specified
442
+ by jid. the delete mode is capable of parsing the output of list and
443
+ query modes, making it possible to create custom filters to delete jobs
444
+ meeting very specific conditions.
445
+
446
+ 'mode_args' are the same as for list.
447
+
448
+ note that it is NOT possible to delete a running job. rq has a
449
+ decentralized architechture which means that compute nodes are completely
450
+ independant of one another; an extension is that there is no way to
451
+ communicate the deletion of a running job from the queue the the node
452
+ actually running that job. it is not an error to force a job to die
453
+ prematurely using a facility such as an ssh command spawned on the remote
454
+ host to kill it. once a job has been noted to have finished, whatever the
455
+ exit status, it can be deleted from the queue.
456
+
457
+ examples :
458
+
459
+ 0) delete all pending, finished, and dead jobs from a queue
460
+
461
+ ~ > rq q d all
462
+
463
+ 1) delete all pending jobs from a queue
464
+
465
+ ~ > rq q d p
466
+
467
+ 2) delete all finished jobs from a queue
468
+
469
+ ~ > rq q d f
470
+
471
+ 3) delete jobs via hand crafted filter program
472
+
473
+ ~ > rq q list | yaml_filter_prog | rq q d -
474
+
475
+ an example ruby filter program (you have to love this)
476
+
477
+ ~ > cat yaml_filter_prog
478
+ require 'yaml'
479
+ joblist = YAML::load STDIN
480
+ y joblist.select{|job| job['command'] =~ /bombing_program/}
481
+
482
+ this program reads the list of jobs (yaml) from stdin and then dumps
483
+ only those jobs whose command matches 'bombing_program', which is
484
+ subsequently piped to the delete command.
485
+
486
+
487
+ update, u :
488
+
489
+ update assumes all leading arguments are jids to update with subsequent
490
+ key=value pairs. currently only the 'command', 'priority', and 'tag'
491
+ fields of pending jobs can be generically updated and the 'state' field
492
+ may be toggled between pending and holding.
493
+
494
+ examples:
495
+
496
+ 0) update the priority of job 42
497
+
498
+ ~ > rq q update 42 priority=7
499
+
500
+ 1) update the priority of all pending jobs
501
+
502
+ ~ > rq q update pending priority=7
503
+
504
+ 2) query jobs with a command matching 'foobar' and update their command
505
+ to be 'barfoo'
506
+
507
+ ~ > rq q q "command like '%foobar%'" |\\
508
+ rq q u command=barfoo
509
+
510
+ 3) place a hold on jid 2
511
+
512
+ ~ > rq q u 2 state=holding
513
+
514
+ 4) place a hold on all jobs with tag=disk_filler
515
+
516
+ ~ > rq q q tag=disk_filler | rq q u state=holding -
517
+
518
+ 5) remove the hold on jid 2
519
+
520
+ ~ > rq q u 2 state=pending
521
+
522
+
523
+ query, q :
524
+
525
+ query exposes the database more directly the user, evaluating the where
526
+ clause specified on the command line (or read from stdin). this feature
527
+ can be used to make a fine grained slection of jobs for reporting or as
528
+ input into the delete command. you must have a basic understanding of SQL
529
+ syntax to use this feature, but it is fairly intuitive in this limited
530
+ capacity.
531
+
532
+ examples:
533
+
534
+ 0) show all jobs submitted within a specific 10 minute range
535
+
536
+ ~ > a='2004-06-29 22:51:00'
537
+
538
+ ~ > b='2004-06-29 22:51:10'
539
+
540
+ ~ > rq q query "started >= '$a' and started < '$b'"
541
+
542
+ 1) shell quoting can be tricky here so input on stdin is also allowed to
543
+ avoid shell expansion
544
+
545
+ ~ > cat constraints.txt
546
+ started >= '2004-06-29 22:51:00' and
547
+ started < '2004-06-29 22:51:10'
548
+
549
+ ~ > rq q query < contraints.txt
550
+ or (same thing)
551
+
552
+ ~ > cat contraints.txt| rq q query -
553
+
554
+ 2) this query output might then be used to delete those jobs
555
+
556
+ ~ > cat contraints.txt | rq q q - | rq q d -
557
+
558
+ 3) show all jobs which are either finished or dead
559
+
560
+ ~ > rq q q "state='finished' or state='dead'"
561
+
562
+ 4) show all jobs which have non-zero exit status
563
+
564
+ ~ > rq q query exit_status!=0
565
+
566
+ 5) if you plan to query groups of jobs with some common feature consider
567
+ using the '--tag, -t' feature of the submit mode which allows a user to
568
+ tag a job with a user defined string which can then be used to easily
569
+ query that job group
570
+
571
+ ~ > rq q submit --tag=my_jobs - < joblist
572
+
573
+ ~ > rq q query tag=my_jobs
574
+
575
+
576
+ 6) in general all but numbers will need to be surrounded by single
577
+ quotes unless the query is a 'simple' one. a simple query is a query
578
+ with no boolean operators, not quotes, and where every part of it looks
579
+ like
580
+
581
+ key op value
582
+
583
+ with ** NO SPACES ** between key, op, and value. if, and only if,
584
+ the query is 'simple' rq will contruct the where clause
585
+ appropriately. the operators accepted, and their meanings, are
586
+
587
+ = : equivalence : sql =
588
+ =~ : matches : sql like
589
+ !~ : not matches : sql not like
590
+
591
+ match, in the context is ** NOT ** a regular expression but a sql
592
+ style string match. about all you need to know about sql matches is
593
+ that the '%' char matches anything. multiple simple queries will be
594
+ joined with boolean 'and'
595
+
596
+ this sounds confusing - it isn't. here are some examples of simple
597
+ queries
598
+
599
+ 6.a)
600
+ query :
601
+ rq q query tag=important
602
+
603
+ where_clause :
604
+ "( tag = 'important' )"
605
+
606
+ 6.b)
607
+ query :
608
+ rq q q priority=6 restartable=true
609
+
610
+ where_clause :
611
+ "( priority = 6 ) and ( restartable = 'true' )"
612
+
613
+ 6.c)
614
+ query :
615
+ rq q q command=~%bombing_job% runner=~%node_1%
616
+
617
+ where_clause :
618
+ "( command like '%bombing_job%') and (runner like '%node_1%')"
619
+
620
+
621
+ execute, e :
622
+
623
+ execute mode is to be used by expert users with a knowledge of sql syntax
624
+ only. it follows the locking protocol used by rq and then allows the user
625
+ to execute arbitrary sql on the queue. unlike query mode a write lock on
626
+ the queue is obtained allowing a user to definitively shoot themselves in
627
+ the foot. for details on a queue's schema the file 'db.schema' in the
628
+ queue directory should be examined.
629
+
630
+ examples :
631
+
632
+ 0) list all jobs
633
+
634
+ ~ > rq q execute 'select * from jobs'
635
+
636
+
637
+ configure, C :
638
+
639
+ this mode is not supported yet.
640
+
641
+
642
+ snapshot, p :
643
+
644
+ snapshot provides a means of taking a snapshot of the q. use this feature
645
+ when many queries are going to be run; for example when attempting to
646
+ figure out a complex pipeline command your test queries will not compete
647
+ with the feeders for the queue's lock. you should use this option
648
+ whenever possible to avoid lock competition.
649
+
650
+ examples:
651
+
652
+ 0) take a snapshot using default snapshot naming, which is made via the
653
+ basename of the q plus '.snapshot'
654
+
655
+ ~ > rq /path/to/nfs/q snapshot
656
+
657
+ 1) use this snapshot to chceck status
658
+
659
+ ~ > rq ./q.snapshot status
660
+
661
+ 2) use the snapshot to see what's running on which host
662
+
663
+ ~ > rq ./q.snapshot list running | grep `hostname`
664
+
665
+ note that there is also a snapshot option - this option is not the same as
666
+ the snapshot command. the option can be applied to ANY command. if in
667
+ effect then that command will be run on a snapshot of the database and the
668
+ snapshot then immediately deleted. this is really only useful if one were
669
+ to need to run a command against a very heavily loaded queue and did not
670
+ wish to wait to obtain the lock. eg.
671
+
672
+ 0) get the status of a heavily loaded queue
673
+
674
+ ~ > rq q t --snapshot
675
+
676
+ 1) same as above
677
+
678
+ ~ > rq q t -s
679
+
680
+ ** IMPORTANT **
681
+
682
+ a really great way to hang all processing in your queue is to do this
683
+
684
+ rq q list | less
685
+
686
+ and then leave for the night. you hold a read lock you won't release
687
+ until less dies. this is what snapshot is made for! use it like
688
+
689
+ rq q list -s | less
690
+
691
+ now you've taken a snapshot of the queue to list so your locks affect no
692
+ one.
693
+
694
+
695
+ lock, L :
696
+
697
+ lock the queue and then execute an arbitrary shell command. lock mode
698
+ uses the queue's locking protocol to safely obtain a lock of the specified
699
+ type and execute a command on the user's behalf. lock type must be one of
700
+
701
+ (r)ead | (sh)ared | (w)rite | (ex)clusive
702
+
703
+ examples :
704
+
705
+ 0) get a read lock on the queue and make a backup
706
+
707
+ ~ > rq q L read -- cp -r q q.bak
708
+
709
+ (the '--' is needed to tell rq to stop parsing command line
710
+ options which allows the '-r' to be passed to the 'cp' command)
711
+
712
+ ** IMPORTANT **
713
+
714
+ this is another fantastic way to freeze your queue - use with care!
715
+
716
+
717
+ backup, b :
718
+
719
+ backup mode is exactly the same as getting a read lock on the queue and
720
+ making a copy of it. this mode is provided as a convenience.
721
+
722
+ 0) make a backup of the queue using default naming ( qname + timestamp + .bak )
723
+
724
+ ~ > rq q b
725
+
726
+ 1) make a backup of the queue as 'q.bak'
727
+
728
+ ~ > rq q b q.bak
729
+
730
+
731
+ rotate, r :
732
+
733
+ rotate mode is conceptually similar to log rolling. normally the list of
734
+ finished jobs will grow without bound in a queue unless they are manually
735
+ deleted. rotation is a method of trimming finished jobs from a queue
736
+ without deleting them. the method used is that the queue is copied to a
737
+ 'rotation'; all jobs that are dead or finished are deleted from the
738
+ original queue and all pending and running jobs are deleted from the
739
+ rotation. in this way the rotation becomes a record of the queue's
740
+ finished and dead jobs at the time the rotation was made.
741
+
742
+ 0) rotate a queue using default rotation name
743
+
744
+ ~ > rq q rotate
745
+
746
+ 1) rotate a queue naming the rotation
747
+
748
+ ~ > rq q rotate q.rotation
749
+
750
+ 2) a crontab entry like this could be used to rotate a queue daily
751
+
752
+ 59 23 * * * rq q rotate `date +q.%Y%m%d`
753
+
754
+
755
+ feed, f :
756
+
757
+ take jobs from the queue and run them on behalf of the submitter as
758
+ quickly as possible. jobs are taken from the queue in an 'oldest highest
759
+ priority' first order.
760
+
761
+ feeders can be run from any number of nodes allowing you to harness the
762
+ CPU power of many nodes simoultaneously in order to more effectively
763
+ clobber your network, anoy your sysads, and set output raids on fire.
764
+
765
+ the most useful method of feeding from a queue is to do so in daemon mode
766
+ so that if the process loses it's controling terminal it will not exit
767
+ when you exit your terminal session. use the '--daemon, -d' option to
768
+ accomplish this. by default only one feeding process per host per queue
769
+ is allowed to run at any given moment. because of this it is acceptable
770
+ to start a feeder at some regular interval from a cron entry since, if a
771
+ feeder is alreay running, the process will simply exit and otherwise a new
772
+ feeder will be started. in this way you may keep feeder processing
773
+ running even acroess machine reboots without requiring sysad intervention
774
+ to add an entry to the machine's startup tasks.
775
+
776
+
777
+ examples :
778
+
779
+ 0) feed from a queue verbosely for debugging purposes, using a minimum
780
+ and maximum polling time of 2 and 4 respectively. you would NEVER
781
+ specify polling times this brief except for debugging purposes!!!
782
+
783
+ ~ > rq q feed -v4 --min_sleep=2 --max_sleep=4
784
+
785
+ 1) same as above, but viewing the executed sql as it is sent to the
786
+ database
787
+
788
+ ~ > RQ_SQL_DEBUG=1 rq q feed -v4 --min_sleep=2 --max_sleep=4
789
+
790
+ 2) feed from a queue in daemon mode - logging to /home/ahoward/rq.log
791
+
792
+ ~ > rq q feed --daemon -l/home/$USER/rq.log
793
+
794
+ log rolling in daemon mode is automatic so your logs should never
795
+ need to be deleted to prevent disk overflow.
796
+
797
+
798
+ start :
799
+
800
+ the start mode is equivalent to running the feed mode except the --daemon
801
+ is implied so the process instantly goes into the background. also, if no
802
+ log (--log) is specified in start mode a default one is used. the default
803
+ is /home/$USER/$BASENAME_OF_Q.log
804
+
805
+ examples :
806
+
807
+ 0) start a daemon process feeding from q
808
+
809
+ ~ > rq q start
810
+
811
+ 1) use something like this sample crontab entry to keep a feeder running
812
+ forever - it attempts to (re)start every fifteen minutes but exits if
813
+ another process is already feeding. output is only created when the
814
+ daemon is started so your mailbox will not fill up with this crontab
815
+ entry:
816
+
817
+ #
818
+ # crontab.sample
819
+ #
820
+
821
+ */15 * * * * /path/to/bin/rq /path/to/q start
822
+
823
+ and entry like this on every node in your cluster is all that's needed
824
+ to keep your cluster going - even after a reboot.
825
+
826
+
827
+ shutdown :
828
+
829
+ tell a running feeder to finish any pending jobs and then to exit. this
830
+ is equivalent to sending signal 'SIGTERM' to the process - this is what
831
+ using 'kill pid' does by default.
832
+
833
+ examples :
834
+
835
+ 0) stop a feeding process, if any, that is feeding from q. allow all
836
+ jobs to be finished first.
837
+
838
+ ~ > rq q shutdown
839
+
840
+ ** VERY IMPORTANT **
841
+
842
+ if you are keeping your feeder alive with a crontab entry you'll need to
843
+ comment it out before doing this or else it will simply re-start!!!
844
+
845
+ stop :
846
+
847
+ tell any running feeder to stop NOW. this sends signal 'SIGKILL' (-9) to
848
+ the feeder process. the same warning as for shutdown applies!!!
849
+
850
+ examples :
851
+
852
+ 0) stop a feeding process, if any, that is feeding from q. allow NO
853
+ jobs to be finished first - exit instantly.
854
+
855
+ ~ > rq q stop
856
+
857
+ cron :
858
+
859
+ when given 'start' for 'mode_args' this option automatically adds a
860
+ crontab entry to keep a feeder alive indefinitely and starts a feeder in
861
+ the background. this is a shortcut to start a feeder and ensure it stays
862
+ running forever, even across re-boots.
863
+
864
+ 'stop' as an argument applys the inverse option: any crontab entry is
865
+ removed and the daemon shutdown nicely. a second argument of 'hard' will
866
+ do a stop instead of a shutdown.
867
+
868
+ the addition and subtraction of crontab entries is robust, however, if you
869
+ already have crontab lines maintaining your feeders with a vastly
870
+ different syntax it would be best to shut down, remove them, and then let
871
+ rq manage them. then again, some people are quite brave...
872
+
873
+ examples :
874
+
875
+ 0) automatically add crontab entry and start daemon feeder
876
+
877
+ ~ > rq q cron start
878
+
879
+ 1) automatically remove crontab entry and shutdown daemon feeder nicely
880
+
881
+ ~ > rq q cron shutdown
882
+
883
+ 2) the same, but using stop instead of shutdown
884
+
885
+ ~ > rq q cron stop
886
+
887
+ pid :
888
+
889
+ show the pid, if any, of the feeder on this host
890
+
891
+ ~ > rq q feeder
892
+ ---
893
+ pid : 3176
894
+
895
+
896
+ ioview, io :
897
+
898
+ as shown in the description for submit, a job maybe be provided stdin
899
+ during job submission. the stdout and stderr of the job are also captured
900
+ as the job is run. all three streams are captured in files located
901
+ relative to the queue. so, if one has submitted a job, and it's jid was
902
+ shown to be 42, by using something like
903
+
904
+ ~ > rq /path/to/q submit myjob --stdin=myjob.in
905
+ ---
906
+ -
907
+ jid : 42
908
+ priority : 0
909
+ ...
910
+ stdin : stdin/42
911
+ stdout : stdout/42
912
+ stderr : stderr/42
913
+ ...
914
+ command : myjob
915
+
916
+ the stdin file will exists as soon as the job is submitted and the others
917
+ will exist once the job has begun running. note that these paths are
918
+ shown relative to the queue. in this case the actual paths would be
919
+
920
+ /path/to/q/stdin/42
921
+ /path/to/q/stdout/42
922
+ /path/to/q/stderr/42
923
+
924
+ but, since our queue is nfs mounted the /path/to/q may or may not be the
925
+ same on every host. thus the path is a relative one. this can make it
926
+ anoying to view these files, but rq assists here with the ioview command.
927
+ the ioview command spawns an external editor to view all three files.
928
+ it's use is quite simple
929
+
930
+ examples :
931
+
932
+ 0) view the stdin/stdout/stderr of job id 42
933
+
934
+ ~ > rq q ioview 42
935
+
936
+ by default this will open up all three files in vim. the editor command
937
+ can be specified using the '--editor' option or the ENV var RQ_EDITOR.
938
+ the default value is 'vim -R -o' which allows all three files to be opened
939
+ in a single window.
940
+
941
+
942
+ stdin, 0 :
943
+
944
+ dump the stdinput (if any) provided to the job
945
+
946
+ examples :
947
+
948
+ 0) dump the stdin for jid 42
949
+
950
+ ~ > rq q stdin 42
951
+
952
+
953
+ stdout, 1 :
954
+
955
+ dump the stdoutput (if any) created by the job
956
+
957
+ examples :
958
+
959
+ 0) dump the stdout for jid 42
960
+
961
+ ~ > rq q stdout 42
962
+
963
+
964
+ stderr, 2 :
965
+
966
+ dump the stderrput (if any) created by the job
967
+
968
+ examples :
969
+
970
+ 0) dump the stderr for jid 42
971
+
972
+ ~ > rq q stderr 42
973
+
974
+
975
+ stdin4 :
976
+
977
+ show the path used for the stdin of a jid
978
+
979
+ examples :
980
+
981
+ 0) show which file has job 42's stdin
982
+
983
+ ~ > rq q stdin4 42
984
+
985
+
986
+ stdout4 :
987
+
988
+ show the path used for the stdout of a jid
989
+
990
+ examples :
991
+
992
+ 0) show which file has job 42's stdout
993
+
994
+ ~ > rq q stdout4 42
995
+
996
+
997
+ stderr4 :
998
+
999
+ show the path used for the stderr of a jid
1000
+
1001
+ examples :
1002
+
1003
+ 0) show which file has job 42's stderr
1004
+
1005
+ ~ > rq q stderr4 42
1006
+
1007
+
1008
+ recover :
1009
+
1010
+ it is possible that a hardware failure might corrupt an rq database. this
1011
+ isn't the kind of thing people like hearing, but it's true - hardware has
1012
+ errors. in these situations a database can sometimes be readable, but not
1013
+ writable, or some other combination. this has been reported only a
1014
+ handful of times, nevertheless, this command wraps sqlite recovery to get
1015
+ you rolling again, it's acceptable to perform recovery on a live rq
1016
+ database with active feeders
1017
+
1018
+ examples :
1019
+
1020
+ 0) recover!
1021
+
1022
+ ~ > rq q recover
1023
+
1024
+
1025
+ help, h :
1026
+
1027
+ this message
1028
+
1029
+ examples :
1030
+
1031
+ 0) get this message
1032
+
1033
+ ~> rq q help
1034
+
1035
+ or
1036
+
1037
+ ~> rq help
1038
+
1039
+ NOTES
1040
+ - realize that your job is going to be running on a remote host and this has
1041
+ implications. paths, for example, should be absolute, not relative.
1042
+ specifically the submitted job script must be visible from all hosts
1043
+ currently feeding from a queue as must be the input and output
1044
+ files/directories.
1045
+
1046
+ - jobs are currently run under the bash shell using the --login option.
1047
+ therefore any settings in your .bashrc will apply - specifically your PATH
1048
+ setting. you should not, however, rely on jobs running with any given
1049
+ environment.
1050
+
1051
+ - you need to consider __CAREFULLY__ what the ramifications of having
1052
+ multiple instances of your program all potentially running at the same
1053
+ time will be. for instance, it is beyond the scope of rq to ensure
1054
+ multiple instances of a given program will not overwrite each others
1055
+ output files. coordination of programs is left entirely to the user.
1056
+
1057
+ - the list of finished jobs will grow without bound unless you sometimes
1058
+ delete some (all) of them. the reason for this is that rq cannot know
1059
+ when the user has collected the exit_status of a given job, and so keeps
1060
+ this information in the queue forever until instructed to delete it. if
1061
+ you have collected the exit_status of you job(s) it is not an error to
1062
+ then delete that job from the finished list - the information is kept for
1063
+ your informational purposes only. in a production system it would be
1064
+ normal to periodically save, and then delete, all finished jobs.
1065
+
1066
+ - know that it is a VERY bad idea to spawn several dozen process all
1067
+ reading/writing huge output files to a single NFS server. use this
1068
+ paradigm instead
1069
+
1070
+ * copy/move data from global input space to local disk
1071
+ * process data
1072
+ * move data on local disk to global output space
1073
+
1074
+ this, of course, applies to any nfs processing, not just those jobs
1075
+ submitted to rq
1076
+
1077
+ the vsftp daemon is an excellent utility to have running on hosts in your
1078
+ cluster so anonymous ftp can be used to get/put data between any two
1079
+ hosts.
1080
+
1081
+ - know that nfs locking is very, very easy to break with firewalls put in
1082
+ place by overzealous system administrators. be postive not only that nfs
1083
+ locking works, but that lock recovery server/client crash or reboot works
1084
+ as well. http://nfs.sourceforge.net/ is the place to learn about NFS. my
1085
+ experience thus far is that there are ZERO properly configured NFS
1086
+ installations in the world. please test yours. contact me for a simple
1087
+ script which can assist you. beer donations required as payment.
1088
+
1089
+ ENVIRONMENT
1090
+ RQ_Q: set to the full path of nfs mounted queue
1091
+
1092
+ the queue argument to all commands may be omitted if, and only if, the
1093
+ environment variable 'RQ_Q' contains the full path to the q. eg.
1094
+
1095
+ ~ > export RQ_Q=/full/path/to/my/q
1096
+
1097
+ this feature can save a considerable amount of typing for those weak of
1098
+ wrist.
1099
+
1100
+ a shell script like this can also be used to avoid needing to type the
1101
+ queue name each and every time
1102
+
1103
+ ~ > cat my_q
1104
+ #!/bin/sh
1105
+ rq /full/path/to/my/q "$@"
1106
+
1107
+ and then all operations become, for example
1108
+
1109
+ ~> my_q submit my_mob
1110
+ ~> my_q status
1111
+ ~> my_q delete 42
1112
+
1113
+ RQ_OPTS | RQ_OPTIONS: specify extra options
1114
+
1115
+ this ENV var can be used to specify options which should always apply, for
1116
+ example
1117
+
1118
+ ~ > export RQ_OPTS=--restartable
1119
+
1120
+ and shell script like this might be used to mark jobs submitted by a
1121
+ certain user and to always submit them at a negative priority
1122
+
1123
+ ~ > cat username_q
1124
+ #!/bin/sh
1125
+ export RQ_OPTS="--tag=username --priority=-42"
1126
+ rq /full/path/to/my/q "$@"
1127
+
1128
+ actual command line options wil always override options given this way
1129
+
1130
+ DIAGNOSTICS
1131
+ success : $? == 0
1132
+ failure : $? != 0
1133
+
1134
+ CREDITS
1135
+ - kim baugh : patient tester and design input
1136
+ - jeff safran : the guy can break anything
1137
+ - chris elvidge : boss who made it possible
1138
+ - trond myklebust : tons of help with nfs
1139
+ - jamis buck : for writing the sqlite bindings for ruby
1140
+ - _why : for writing yaml for ruby
1141
+ - matz : for writing ruby
1142
+
1143
+ AUTHOR
1144
+ #{ AUTHOR }
1145
+
1146
+ BUGS
1147
+ 0 < bugno && bugno <= 42
1148
+
1149
+ reports to #{ AUTHOR }
1150
+ usage
1151
+ #--}}}
1152
+ #--}}}
1153
+ end # module Usage
1154
+ #--}}}
1155
+ end # module RQ
1156
+ $__rq_usage__ = __FILE__
1157
+ end