別のbashスクリプトを実行し、独自に再帰的に実行されるbashスクリプトを実行すると、このエラーが発生します。
私が使用するスクリプトでは、xdotool
私が使用しているすべてのスクリプトでカウンタが生成され、呼び出されます($RANDOM
while $RANDOM
-loopで呼び出されるファイルも最大20回繰り返されます)、すべてのコマンドはecho 'command'を使用してリフローしてファイルに保存するように指示されます。
私には、次のエラーが発生します。
./somescript.sh: fork: Cannot allocate memory
オペレーティングシステム情報: Antergos 64ビット+ Openbox + 8GB RAM
開く:qtcreator、lxterminal、私のqtアプリケーション(100Mb)ログファイルのサイズは3,5 МіBです。私のものulimit -a
:
[user@workstation MonkeyClicker]$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31856
max locked memory (kbytes, -l) 1024
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 31856
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
私のrun.sh
スクリプト:
#!/bin/bash
if [ -z $1 ]
then
echo ' '
echo '***************MONKEY TESTING TOOL HELP***************'
echo ' '
echo 'command: run.sh [start delay]'
echo '[start delay] - means that you have X seconds to start your program'
echo 'for example : run.sh 3s 0.1s'
echo ' '
else
mkdir -p logScript
./monkeyTestingTool.sh $1 > $PWD/logScript/script.sh
fi
私のmonkeyTestingTool.sh
スクリプト:
!/bin/bash
if [ $1 ]
then
echo '#Started in:' $date
echo '#MONKEY TESTING START, BE CAREFUL!'
echo '#You have' $1 'seconds to open your app for testing ...'
sleep $1
fi
echo $(xdotool getmouselocation --shell)
echo 'xdotool mousemove --sync $X $Y'
RANGE=7
CHOOSE=$RANDOM
let "CHOOSE %= $RANGE"
case $CHOOSE in
0) sh ./move.sh
;;
1) sh ./callContextMenu.sh
;;
2) sh ./typeRandom.sh
;;
3) xdotool click 1 #this is leftMouseClick
;;
4) sh ./keyPressing.sh
;;
5) sh ./move.sh
;;
6) sh ./dragDrop.sh
#*) TODO: drag and drop
esac
./monkeyTestingTool.sh
たとえば、私のcallContextMenu.sh
スクリプトは次のようになります。
#!/bin/bash
echo $(xdotool getmouselocation --shell)
echo 'xdotool mousemove --sync $X $Y'
echo 'xdotool click 3'
xdotool click 3
LASTKEY=0
RANGESTEPS=20
STEPS=$RANDOM
let "STEPS %= $RANGESTEPS"
while [ $STEPS != 0 ]; do
RANGE=5
CHOOSE=$RANDOM
let "CHOOSE %= $RANGE"
let STEPS=STEPS-1
LASTKEY=$CHOOSE
case $CHOOSE in
0) xdotool key Up
echo 'xdotool key Up'
;;
1) xdotool key Left
echo 'xdotool key Left'
;;
2) xdotool key Down
echo 'xdotool key Down'
;;
3) if [ $STEPS == 1 ]
then
echo 'xdotool key Return'
xdotool key Return
fi
;;
4) xdotool key Right
echo 'xdotool key Right'
;;
esac
done
if [ $LASTKEY != 3 ]
then
echo 'xdotool key Return'
xdotool key Return
else
echo 'xdotool key Down'
echo 'xdotool Return'
xdotool key Down
xdotool key Return
fi
答え1
最後の回線monkeyTestingTool.sh
呼び出し自体
./monkeyTestingTool.sh
これはすぐに何百ものプログラムのコピーを実行することを意味します。
スクリプトを再実行するには、最後の行を実行します。
exec ./monkeyTestingTool.sh
または、すべてをwhile
次のようなループに入れます。
while [ 1 ]
do
CHOOSE=$RANDOM
let "CHOOSE %= $RANGE"
case $CHOOSE in
0) sh ./move.sh
;;
....
esac
done