Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F5964017
limit.sh
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
limit.sh
View Options
#!/bin/bash
#
# Resource limiting wrapper for command execution
# Clean up cgroup
cleanup
()
{
# First we have to move the current task into a "garbage" group, otherwise
# the cgroup will not be empty, and attempting to remove it will fail with
# "Device or resource busy"
if
[
-w
"
$SB_CGROUP
"
/tasks
]
;
then
GARBAGE
=
"
$SB_CGROUP
"
else
GARBAGE
=
"
$SB_CGROUP
"
/garbage-
`
id
-un
`
if
[
!
-e
"
$GARBAGE
"
]
;
then
mkdir
-m
0700
"
$GARBAGE
"
fi
fi
echo
$BASHPID
>
"
$GARBAGE
"
/tasks
# Suppress errors in case the cgroup has disappeared due to a release script
rmdir
"
$SB_CGROUP
"
/
$$
2
>/dev/null
}
updateTaskCount
()
{
# There are lots of ways to count lines in a file in shell script, but this
# is one of the few that doesn't create another process, which would
# increase the returned number of tasks.
readarray
<
"
$SB_CGROUP
"
/
$$
/tasks
NUM_TASKS
=
${#
MAPFILE
[*]
}
}
log
()
{
echo
limit.sh:
"
$*
"
>
&
3
echo
limit.sh:
"
$*
"
>
&
2
}
SB_INCLUDE_STDERR
=
SB_USE_LOG_PIPE
=
SB_CPU_LIMIT
=
0
SB_CGROUP
=
SB_MEM_LIMIT
=
0
SB_FILE_SIZE_LIMIT
=
0
SB_WALL_CLOCK_LIMIT
=
0
# Override settings
eval
"
$2
"
if
[
-n
"
$SB_INCLUDE_STDERR
"
]
;
then
exec
2
>
&
1
fi
if
[
-z
"
$SB_USE_LOG_PIPE
"
]
;
then
# Open a dummy log FD
exec
3
>/dev/null
fi
if
[
"
$SB_CPU_LIMIT
"
-gt
0
]
;
then
ulimit
-t
"
$SB_CPU_LIMIT
"
fi
if
[
"
$SB_MEM_LIMIT
"
-gt
0
]
;
then
if
[
-n
"
$SB_CGROUP
"
]
;
then
# Create cgroup
if
!
mkdir
-m
0700
"
$SB_CGROUP
"
/
$$
;
then
log
"failed to create the cgroup."
SB_CGROUP
=
""
fi
fi
if
[
-n
"
$SB_CGROUP
"
]
;
then
echo
$$
>
"
$SB_CGROUP
"
/
$$
/tasks
if
[
-n
"
$SB_CGROUP_NOTIFY
"
]
;
then
echo
"1"
>
"
$SB_CGROUP
"
/
$$
/notify_on_release
fi
# Memory
echo
$SB_MEM_LIMIT
>
"
$SB_CGROUP
"
/
$$
/memory.limit_in_bytes
# Memory+swap
# This will be missing if there is no swap
if
[
-e
"
$SB_CGROUP
"
/
$$
/memory.memsw.limit_in_bytes
]
;
then
echo
$SB_MEM_LIMIT
>
"
$SB_CGROUP
"
/
$$
/memory.memsw.limit_in_bytes
fi
fi
else
SB_CGROUP
=
""
fi
if
[
"
$SB_FILE_SIZE_LIMIT
"
-gt
0
]
;
then
ulimit
-f
"
$SB_FILE_SIZE_LIMIT
"
fi
if
[
"
$SB_WALL_CLOCK_LIMIT
"
-gt
0
-a
-x
"/usr/bin/timeout"
]
;
then
/usr/bin/timeout
$SB_WALL_CLOCK_LIMIT
/bin/bash
-c
"
$1
"
3
>
&
-
STATUS
=
"
$?
"
if
[
"
$STATUS
"
==
124
]
;
then
log
"timed out executing command \"
$1
\""
fi
else
eval
"
$1
"
3
>
&
-
STATUS
=
"
$?
"
fi
if
[
-n
"
$SB_CGROUP
"
]
;
then
updateTaskCount
if
[
$NUM_TASKS
-gt
1
]
;
then
# Spawn a monitor process which will continue to poll for completion
# of all processes in the cgroup after termination of the parent shell
(
while
[
$NUM_TASKS
-gt
1
]
;
do
sleep
10
updateTaskCount
done
cleanup
)
>
&
/dev/null
<
/dev/null
3
>
&
-
&
disown
-a
else
cleanup
fi
fi
exit
"
$STATUS
"
File Metadata
Details
Attached
Mime Type
text/x-shellscript
Expires
Sat, Oct 3, 10:01 (1 w, 2 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
a8/d0/1de822f60530f5130497e7fc7dca
Default Alt Text
limit.sh (2 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment