Я обнаружил, что это интересная проблема. Установление максимума и минимума каждого броска не так очевидно, как можно было бы сначала догадаться.
function repeatRolls(cnt) {
var cnt= cnt || 100;
var mindie=100000;
var maxdie=-100000;
var s='<style>th,td{border: 1px solid black;padding:5px;}</style><table>';
for(var i=0;i<cnt;i++) {
var rObj=rollTheDice(12,-12,20);
if(i==0) {
s+='<tr><th>Roll</th>';
for(var k=0;k<rObj.roll.length;k++) {
s+=Utilities.formatString('<th>Die %s</th>',k+1);
}
s+='<th>Sum</th></tr>';
}
s+=Utilities.formatString('<tr><td>%s</td>',i+1);
for(var j=0;j<rObj.roll.length;j++) {
s+=Utilities.formatString('<td>%s</td>', rObj.roll[j]);
if(rObj.roll[j]>maxdie){maxdie=rObj.roll[j];}
if(rObj.roll[j]<mindie){mindie=rObj.roll[j];}
}
s+=Utilities.formatString('<td>%s</td></tr>',rObj.total);
}
s+=Utilities.formatString('</table><br />maxdie: %s<br />mindie: %s',maxdie,mindie);
var userInterface=HtmlService.createHtmlOutput(s).setWidth(1200);
SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Rolling the Dice');
}
Функция крена с максимальным штампом, минимальным штампом и количеством параметров кубиков, которые действительно работают.
function getSum(total,num) {
return total + num;
}
function rollTheDice(max,min,num) {
var num = num || 6;
var min = min || 1;
var max = max || 6
var roll=[];
for (var i=0;i<num;i++){
roll.push(Math.floor(Math.random() * (max-min+1))+min);
}
return {roll:roll,total:roll.reduce(getSum)};
}
Так как Вы говорите, что можно отредактировать сам сценарий, просто поместить a:
ps -ef >/tmp/bash_stack_trace.$$
в нем, где проблема происходит.
Это создаст много файлов в Вашем tmp
каталог, которые показывают весь список процессов в то время, когда это произошло.
Можно затем удаться который процесс, названный который другой процесс путем исследования этого вывода. Это может или быть сделано вручную или автоматизировано с чем-то как awk
, так как вывод является регулярным - Вы просто используете их PID
и PPID
столбцы для разработки отношений между всеми процессами Вы интересуетесь.
Необходимо будет следить за файлами, так как Вы получите одно для каждого процесса, таким образом, их, вероятно, придется управлять. Так как это - что-то, что должно только быть сделано во время отладки, большую часть времени та строка будет прокомментирована (предшествовавший #
), таким образом, файлы не будут созданы.
Для чистки их можно просто сделать:
rm /tmp/bash_stack_trace.*
при добавлении pstree-p-u 'whoami'>> вывод в сценарии, вероятно, получит Вас информация, в которой Вы нуждаетесь.
~$ help caller
caller: caller [EXPR]
Returns the context of the current subroutine call.
Without EXPR, returns "$line $filename". With EXPR,
returns "$line $subroutine $filename"; this extra information
can be used to provide a stack trace.
The value of EXPR indicates how many call frames to go back before the
current one; the top frame is frame 0.
Вы могли попробовать что-то как
strace -f -e execve script.sh
Простой сценарий, который я написал несколько дней назад ...
# FILE : sctrace.sh
# LICENSE : GPL v2.0 (only)
# PURPOSE : print the recursive callers' list for a script
# (sort of a process backtrace)
# USAGE : [in a script] source sctrace.sh
#
# TESTED ON :
# - Linux, x86 32-bit, Bash 3.2.39(1)-release
# REFERENCES:
# [1]: http://tldp.org/LDP/abs/html/internalvariables.html#PROCCID
# [2]: http://linux.die.net/man/5/proc
# [3]: http://linux.about.com/library/cmd/blcmdl1_tac.htm
#! /bin/bash
TRACE=""
CP=$$ # PID of the script itself [1]
while true # safe because "all starts with init..."
do
CMDLINE=$(cat /proc/$CP/cmdline)
PP=$(grep PPid /proc/$CP/status | awk '{ print $2; }') # [2]
TRACE="$TRACE [$CP]:$CMDLINE\n"
if [ "$CP" == "1" ]; then # we reach 'init' [PID 1] => backtrace end
break
fi
CP=$PP
done
echo "Backtrace of '$0'"
echo -en "$TRACE" | tac | grep -n ":" # using tac to "print in reverse" [3]
... и простой тест.
Надеюсь, вам понравится.