Чтобы узнать, следует ли посылать процессу сигнал STOP или CONT, вам необходимо сначала выяснить его текущее состояние.
Состояние запущенного процесса можно узнать с помощью ps
. Если процесс остановлен, то его состояние, как сообщает ps -ostate =
, будет содержать букву T
(знак равенства остановит вывод ps
заголовок).
#!/bin/bash
command="audacity"
pids="$( pgrep "$command" )"
if [[ -z "$pids" ]]; then
printf '"%s" is not running\n' "$command" >&2
exit 1
fi
for pid in $pids; do
state="$( ps -ostate= -p "$pid" )"
stopped=0
case "$state" in
*T*) stopped=1 ;;
esac
if (( stopped )); then
kill -s CONT "$pid"
printf '"%s" (%d) has been unpaused\n' "$command" "$pid"
else
kill -s STOP "$pid"
printf '"%s" (%d) has been paused\n' "$command" "$pid"
fi
done
В сценарии существует теоретическое состояние гонки, при котором команда могла завершиться между вызовом pgrep
и вызовом kill
. Все, что произойдет в этом случае, - это то, что kill
будет жаловаться на «отсутствие такого процесса».
В качестве меры предосторожности, sudo
сбрасывает список переменных окружения (TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME и SUDO_*) в опции env_reset
, которая включена по умолчанию. Для того чтобы HOME переносился из вашей учетной записи пользователя в среду sudo
, вам придется либо:
использовать тег SETENV в правиле sudo вместе с опцией -E
, либо
специально снять опцию env_reset
.
Дополнительно убедитесь, что опция always_set_home
выключена (по умолчанию она выключена).
Все подробности и взаимодействие смотрите на странице sudoers man.