Advertisement
PanaPatryk44

uruchom.sh

Jun 18th, 2017
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.93 KB | None | 0 0
  1. #!/usr/bin/bash
  2. # -*- coding: utf-8 -*-
  3.  
  4.  
  5. quiet_run() {
  6. "$@" >/dev/null 2>&1
  7. }
  8.  
  9. c_locale_run() {
  10. LC_ALL="C.UTF-8" LANG="C.UTF-8" LANGUAGE="C" "$@"
  11. }
  12.  
  13.  
  14. is_int() {
  15. c_locale_run quiet_run printf "%d" "$1"
  16. }
  17.  
  18.  
  19. is_float() {
  20. c_locale_run quiet_run printf "%f" "$1"
  21. }
  22.  
  23. log() {
  24. DATE_MAIN=`date +"%F %T.%N"`
  25. echo "[""$DATE_MAIN"" ""$LOG_IDENTITY""-""$BASHPID""]" "$@"
  26. }
  27.  
  28.  
  29. parse_args() {
  30. LOG_IDENTITY="Uninitialized"
  31.  
  32. while getopts ":s:f:n:k:r:i:" OPT
  33. do
  34. case "$OPT" in
  35. s)
  36. FAIL=false
  37. mkdir -p -- "$OPTARG" || FAIL=true
  38.  
  39. if "$FAIL"
  40. then
  41. log "Cannot parse \`\`""$OPTARG""'' as table path."
  42. exit 1
  43. else
  44. TABLE_PATH="$OPTARG"
  45. fi
  46. ;;
  47. f)
  48. FAIL=false
  49. is_int "$OPTARG" || FAIL=true
  50. [[ "$OPTARG" -ge "2" ]] || FAIL=true
  51.  
  52. if "$FAIL"
  53. then
  54. log "Cannot parse \`\`""$OPTARG""'' as number of philosopers."
  55. exit 1
  56. else
  57. PHILOSOPHERS_COUNT="$OPTARG"
  58. fi
  59. ;;
  60. n)
  61. FAIL=false
  62. is_int "$OPTARG" || FAIL=true
  63. [[ "$OPTARG" -ge "0" ]] || FAIL=true
  64.  
  65. if "$FAIL"
  66. then
  67. log "Cannot parse \`\`""$OPTARG""'' as maximum number meals."
  68. exit 1
  69. else
  70. MAX_MEALS="$OPTARG"
  71. fi
  72. ;;
  73. k)
  74. FAIL=false
  75. is_float "$OPTARG" || FAIL=true
  76.  
  77. if (( $(echo "$OPTARG<0" | bc) )); then
  78. FAIL=true
  79. fi
  80.  
  81. if "$FAIL"
  82. then
  83. log "Cannot parse \`\`""$OPTARG""'' as eating time."
  84. exit 1
  85. else
  86. EATING_TIME="$OPTARG"
  87. fi
  88. ;;
  89. r)
  90. FAIL=false
  91. is_float "$OPTARG" || FAIL=true
  92. if (( $(echo "$OPTARG<0" | bc) )); then
  93. FAIL=true
  94. fi
  95. if "$FAIL"
  96. then
  97. log "Cannot parse \`\`""$OPTARG""'' as sleeping time."
  98. exit 1
  99. else
  100. SLEEPING_TIME="$OPTARG"
  101. fi
  102. ;;
  103. i)
  104. FAIL=false
  105. is_int "$OPTARG" || FAIL=true
  106. [[ "$OPTARG" -ge "1" ]] || FAIL=true
  107.  
  108. if "$FAIL"
  109. then
  110. log "Cannot parse \`\`""$OPTARG""'' as philosopher ID."
  111. exit 1
  112. else
  113. PHILOSOPHER_ID="$OPTARG"
  114. LOG_IDENTITY="FID#""$PHILOSOPHER_ID"
  115. fi
  116. ;;
  117. \:)
  118. log "\`\`""-$OPTARG""'' requires some value."
  119. exit 1
  120. ;;
  121. \?)
  122. log "\`\`""-$OPTARG""'' is not a valid argument."
  123. exit 1
  124. ;;
  125. esac
  126. done
  127.  
  128. mkdir -p "$TABLE_PATH""stol"
  129. TABLE_PATH=${TABLE_PATH:-`realpath -- "$TABLE_PATH""stol"`}
  130. PHILOSOPHERS_COUNT=${PHILOSOPHERS_COUNT:-5}
  131. MAX_MEALS=${MAX_MEALS:-7}
  132. SLEEPING_TIME=${SLEEPING_TIME:-0}
  133. EATING_TIME={ EATING_TIME:-0}
  134. PHILOSOPHER_ID=${PHILOSOPHER_ID:-0}
  135. TABLE_LOCK="$TABLE_PATH""/fifio"
  136.  
  137. if [[ "$PHILOSOPHER_ID" -gt "$PHILOSOPHERS_COUNT" ]]
  138. then
  139. log "Philosopher ID greater than number of philosophers (\`\`""$PHILOSOPHER_ID""'' vs \`\`""$PHILOSOPHERS_COUNT""'')."
  140. exit 1
  141. fi
  142.  
  143. MESSAGE=""
  144. MESSAGE="$MESSAGE""Script file: "`realpath -- "$0"`"; "
  145. MESSAGE="$MESSAGE""Execution arguments: """$@"""; "
  146.  
  147. if [[ "$PHILOSOPHER_ID" -eq "0" ]]
  148. then
  149. LOG_IDENTITY="Main"
  150. MESSAGE="$MESSAGE""Context: ""$LOG_IDENTITY""; "
  151. else
  152. MESSAGE="$MESSAGE""Context: ""$LOG_IDENTITY""; "
  153. if [[ "$PHILOSOPHER_ID" -eq "$PHILOSOPHERS_COUNT" ]]
  154. then
  155. FORK_B="$PHILOSOPHER_ID"
  156. FORK_A="1"
  157. else
  158. FORK_A="$PHILOSOPHER_ID"
  159. FORK_B=$[PHILOSOPHER_ID+1]
  160. fi
  161. FORK_A_PATH=`realpath -- "$TABLE_PATH""/""$FORK_A"`
  162. FORK_B_PATH=`realpath -- "$TABLE_PATH""/""$FORK_B"`
  163. fi
  164.  
  165. MESSAGE="$MESSAGE""Table path: \`\`""$TABLE_PATH""''; "
  166. if [[ "$PHILOSOPHER_ID" -ne "0" ]]
  167. then
  168. MESSAGE="$MESSAGE""Primary fork: ""$FORK_A_PATH""; "
  169. MESSAGE="$MESSAGE""Secondary fork: ""$FORK_B_PATH""; "
  170. fi
  171. MESSAGE="$MESSAGE""Philosophers count: ""$PHILOSOPHERS_COUNT""; "
  172. MESSAGE="$MESSAGE""Maximum meals: ""$MAX_MEALS""; "
  173.  
  174. if [[ "$EATING_TIME" -eq "0" ]]
  175. then
  176. MESSAGE="$MESSAGE""Eating time: randomized; "
  177. else
  178. MESSAGE="$MESSAGE""Eating time: ""$EATING_TIME""s; "
  179. fi
  180.  
  181. if [[ "$SLEEPING_TIME" -eq "0" ]]
  182. then
  183. MESSAGE="$MESSAGE""Sleeping time: randomized; "
  184. else
  185. MESSAGE="$MESSAGE""Sleeping time: ""$SLEEPING_TIME""s; "
  186. fi
  187.  
  188. log "^^^START^^^ ""$MESSAGE"
  189. }
  190.  
  191. parse_args "$@"
  192.  
  193. random_time() {
  194. echo "0.""$RANDOM"
  195. }
  196.  
  197. do_eat() {
  198. log "Eating Meal#""$1"" started, it will take ""$2""s"
  199. sleep "$2"
  200. log "Eating Meal#""$1"" finished"
  201. }
  202.  
  203. sleep_after() {
  204. log "Sleeping after Meal#""$1"" started, it will take ""$2""s"
  205. sleep "$2"
  206. log "Sleeping after Meal#""$1"" finished"
  207. }
  208.  
  209. run_philosopher() {
  210. parse_args "$@"
  211.  
  212. HALF_TIME=$[(MAX_MEALS+1)/2]
  213. MEALS_CONSUMED=0
  214.  
  215. for MEAL_ID in `seq 1 "$MAX_MEALS"`
  216. do
  217. ACTUAL_EATING_TIME=${EATING_TIME:-`random_time`}
  218. ACTUAL_SLEEPING_TIME=${SLEEPING_TIME:-`random_time`}
  219.  
  220. log "Trying to acquire Fork WID#""$FORK_A (trying to put exclusive lock on fork "$FORK_A")"
  221. (
  222. flock -x 9
  223. log "Fork WID#""$FORK_A"" acquired successfully(exclusive lock put on fork "$FORK_A")"
  224.  
  225. log "Trying to acquire Fork WID#""$FORK_B(trying to put exclusive lock on fork "$FORK_B")"
  226. (
  227. flock -x 10
  228. log "Fork WID#""$FORK_B"" acquired successfully(exclusive lock put on fork "$FORK_B")"
  229.  
  230. do_eat "$MEAL_ID" "$ACTUAL_EATING_TIME"
  231. ) 10>"$FORK_B_PATH"
  232. log "Putting Fork WID#""$FORK_A"" back(exclusive lock droped from fork "$FORK_B")"
  233.  
  234. ) 9>"$FORK_A_PATH"
  235. log "Putting Fork WID#""$FORK_B"" back(exclusive lock droped from fork "$FORK_B")"
  236.  
  237. MEALS_CONSUMED=$[MEALS_CONSUMED+1]
  238.  
  239. sleep_after "$MEAL_ID" "$ACTUAL_SLEEPING_TIME"
  240.  
  241. if [[ "$MEAL_ID" -eq "$HALF_TIME" ]]
  242. then
  243. log "---POŁOWA--- Meals consumed: ""$MEALS_CONSUMED"
  244. echo > "$TABLE_LOCK"
  245. read line < "$TABLE_LOCK""1"
  246. log "Barrier is passed."
  247.  
  248. fi
  249. done
  250.  
  251. log "___STOP___ Meals consumed: ""$MEALS_CONSUMED"
  252. }
  253.  
  254. mkfifo "$TABLE_LOCK"
  255. mkfifo "$TABLE_LOCK""1"
  256. a=( $(shuf -e $(seq 1 "$PHILOSOPHERS_COUNT")) )
  257. for i in "${a[@]}"
  258. do
  259.  
  260. log `hostname`" STARTUJE FILOZOF... -s "$TABLE_PATH" -f "$PHILOSOPHERS_COUNT" -n "$MAX_MEALS" -k "$EATING_TIME" -r "$SLEEPING_TIME" -i "$i""
  261. run_philosopher -s "$TABLE_PATH" -f "$PHILOSOPHERS_COUNT" -n "$MAX_MEALS" -k "$EATING_TIME" -r "$SLEEPING_TIME" -i "$i" &
  262. done
  263. for i in `seq 1 "$PHILOSOPHERS_COUNT"`
  264. do
  265. read line < "$TABLE_LOCK"
  266. done
  267. for i in `seq 1 "$PHILOSOPHERS_COUNT"`
  268. do
  269. echo > "$TABLE_LOCK""1"
  270. done
  271.  
  272. wait
  273.  
  274. log "___STOP___"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement