Skip to content

Instantly share code, notes, and snippets.

@ORESoftware
Created March 15, 2018 00:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ORESoftware/06dbb26a48d2ddf48a5a2166834e0836 to your computer and use it in GitHub Desktop.
Save ORESoftware/06dbb26a48d2ddf48a5a2166834e0836 to your computer and use it in GitHub Desktop.
using trap for SIGHUP (when user closes terminal window)
#!/usr/bin/env bash
export ql_quicklock_version="0.0.104"
export ql_source_file="$HOME/.quicklock/ql.sh";
export ql_gray='\033[1;30m'
export ql_magenta='\033[1;35m'
export ql_cyan='\033[1;36m'
export ql_orange='\033[1;33m'
export ql_green='\033[1;32m'
export ql_no_color='\033[0m'
on_ql_trap (){
# echo something here
ql_release_lock
}
ql_unlock_process(){
kill -SIGUSR1 "$1" # kill <pid> given by $1, with SIGUSR1 signal...
}
on_ql_conditional_exit (){
if [[ $- == *i* ]]; then
# if we are in a terminal just return, do not exit.
# debugging: echo -e "${ql_orange}quicklock: since we are in a terminal, not exiting.${ql_no_color}";
return 1;
fi
# debugging: echo -e "${ql_orange}quicklock: since we are not in a terminal, we are exiting...${ql_no_color}";
if [[ "$ql_prevent_exit" == "yes" || "$ql_prevent_exit" == "yes" ]]; then
return 1;
fi
exit 1;
}
ql_noop(){
echo "";
}
ql_remove_all_locks (){
rm -rf "$HOME/.quicklock/locks/"*
}
ql_acquire_lock () {
local name="${1}" # the lock name is the first argument, if that is empty, then set the lockname to $PWD
if [[ -z "$name" ]]; then
echo -e "${ql_orange}quicklock: warning - no quicklock_name available so defaulted to \$PWD.${ql_no_color}"
name="$PWD";
fi
mkdir -p "$HOME/.quicklock/locks"
fle=$(echo "${name}" | tr "/" _)
local qln="$HOME/.quicklock/locks/${fle}.lock"
mkdir "${qln}" &> /dev/null || {
echo -e "${ql_magenta}quicklock: could not acquire lock with name '${qln}'${ql_no_color}";
echo -e "${ql_magenta}quicklock: someone else is using that lockname.${ql_no_color}";
on_ql_conditional_exit;
return 1;
}
my_named_pipe="${qln}/$$"
mkfifo "${my_named_pipe}" &> /dev/null; # add the PID inside the lock dir
export ql_current_lockname="${qln}";
trap on_ql_trap EXIT;
trap on_ql_trap 0;
trap on_ql_trap SIGHUP;
echo -e "${ql_gray}quicklock: process id requesting lock: $$, parent process id: $(ps -o ppid= -p $$)${ql_no_color}."
echo -e "${ql_green}quicklock: acquired lock with name '${qln}'${ql_no_color}"
if [[ "$ql_allow_ipc" == "yes" ]]; then
echo -e "quicklock: process is reading from named pipe to listen for incoming messages regarding releasing lock.";
while read line; do ql_on_named_pipe_msg "$line" "$$"; done < ${my_named_pipe} &
fi
}
ql_release_lock () {
local quicklock_name="$ql_current_lockname";
local is_force="nope";
local last="$(echo ${@: -1})"
if [[ "${last}" == "--force" ]]; then
echo -e "${ql_magenta}quicklock: warning using --force.${ql_no_color}";
is_force="yes"
fi
if [[ ! -z "$1" && "$1" != "--force" ]]; then
quicklock_name="${1}";
elif [[ -z "${quicklock_name}" ]]; then
echo -e "${ql_orange}quicklock: warning - no quicklock_name available so defaulted to \$PWD.${ql_no_color}";
quicklock_name="$PWD";
fi
if [[ "$quicklock_name" != "$HOME/.quicklock/locks/"* ]]; then
quicklock_name=$(echo "${quicklock_name}" | tr "/" _)
if [[ "$quicklock_name" =~ [^a-zA-Z0-9\-\_] ]]; then
echo -e "${ql_magenta}quicklock: lockname has invalid chars - must be alpha-numeric chars only.${ql_no_color}"
echo -e "${ql_magenta}quicklock: could not release lock with desired name -> '$fle'.${ql_no_color}"
on_ql_conditional_exit
return 1;
fi
quicklock_name="$HOME/.quicklock/locks/${quicklock_name}.lock";
fi
if [[ -z "${quicklock_name}" ]]; then
echo -e "${ql_orange}quicklock: no lockname was defined. (\$quicklock_name was not set).${ql_no_color}";
ql_maybe_fail;
return 1;
fi
if [[ "$HOME" == "${quicklock_name}" ]]; then
echo -e "${ql_orange}quicklock: dangerous value set for \$quicklock_name variable..was equal to user home directory, not good.${ql_no_color}";
ql_maybe_fail;
return 1;
fi
local current_pid="$$"
local pid_inside="$(ls "${quicklock_name}" 2> /dev/null)";
rm -r "${quicklock_name}" &> /dev/null &&
{ echo -e "${ql_cyan}quicklock: lock with name '${quicklock_name}' was released.${ql_no_color}"; } ||
{ >&2 echo -e "${ql_magenta}quicklock: no lock existed for lockname '${quicklock_name}'.${ql_no_color}"; ql_maybe_fail; }
trap - EXIT; # clear/unset trap
trap ql_noop EXIT;
}
# export all of the functions
export -f ql_remove_all_locks
export -f ql_maybe_fail;
export -f on_ql_conditional_exit;
export -f on_ql_trap;
export -f ql_acquire_lock;
export -f ql_release_lock;
export -f ql_get_lockowner_pid;
export -f ql_ls;
export -f ql_print_version;
export -f ql_unlock_process;
export -f ql_on_named_pipe_msg;
export -f ql_echo_current_lockname;
export -f ql_get_lockname;
export -f ql_write_message;
export -f ql_noop;
# that's it lulz
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment