Как отправить управление + c из bash script?
Я запускаю несколько экранов в bash script, а затем запускаю команду django runserver
в каждом из них. Я хотел бы также программно остановить их всех, что требует от меня отправить Control+c
в runserver
.
Как я могу отправить эти нажатия клавиш из моего bash script?
Ответы
Ответ 1
Ctrl+C отправляет сигнал SIGINT
.
kill -INT <pid>
также посылает сигнал SIGINT
:
# Terminates the program (like Ctrl+C)
kill -INT 888
# Force kill
kill -9 888
Предполагая, что 888
- ваш идентификатор процесса.
Обратите внимание, что kill 888
посылает сигнал SIGTERM
, который немного отличается, но также попросит остановить программу. Поэтому, если вы знаете, что делаете (в программе не привязан обработчик SIGINT
), достаточно простого kill
.
Чтобы получить PID последней команды, запущенной в вашем script, используйте $!
:
# Launch script in background
./my_script.sh &
# Get its PID
PID=$!
# Wait for 2 seconds
sleep 2
# Kill it
kill $PID
Ответ 2
CTRL-C обычно посылает сигнал SIGINT процессу, поэтому вы можете просто:
kill -INT <processID>
из командной строки (или script), чтобы повлиять на конкретный processID
.
Я говорю "вообще", потому что, как и в большинстве UNIX, это почти бесконечно настраивается. Если вы выполните stty -a
, вы увидите, какая последовательность клавиш привязана к сигналу intr
. Вероятно, это будет CTRL-C, но эта последовательность клавиш может быть отображена на что-то еще полностью.
Следующий script показывает это в действии (хотя с TERM
, а не INT
, поскольку sleep
не реагирует на INT
в моей среде):
#!/usr/bin/env bash
sleep 3600 &
pid=$!
sleep 5
echo ===
echo PID is $pid, before kill:
ps -ef | grep -E "PPID|$pid" | sed 's/^/ /'
echo ===
( kill -TERM $pid ) 2>&1
sleep 5
echo ===
echo PID is $pid, after kill:
ps -ef | grep -E "PPID|$pid" | sed 's/^/ /'
echo ===
Он в основном запускает процесс часового журнала sleep
и захватывает свой идентификатор процесса. Затем он выводит соответствующие детали процесса, прежде чем убить процесс.
После небольшого ожидания он затем проверяет таблицу процессов, чтобы узнать, прошел ли процесс. Как вы можете видеть из вывода script, оно действительно исчезло:
===
PID is 28380, before kill:
UID PID PPID TTY STIME COMMAND
pax 28380 24652 tty42 09:26:49 /bin/sleep
===
./qq.sh: line 12: 28380 Terminated sleep 3600
===
PID is 28380, after kill:
UID PID PPID TTY STIME COMMAND
===
Ответ 3
Вы можете получить PID определенного процесса, например MySQL, используя следующие команды:
ps -e | pgrep mysql
Эта команда предоставит вам PID для обработки MySQL. например, 13954
Теперь введите следующую команду в терминал.
kill -9 13954
Это убьет процесс MySQL.
Ответ 4
pgrep -f process_name > any_file_name
sed -i 's/^/kill /' any_file_name
chmod 777 any_file_name
./any_file_name
например, "pgrep -f firefox" будет grep PID запускать "firefox" и сохранит этот PID в файле с именем "any_file_name". Команда "sed" добавит "kill" в начале номера PID в файле "any_file_name". Третья строка сделает исполняемый файл "any_file_name". Теперь следующая строка уничтожит PID, доступный в файле "any_file_name". Запись четырех строк в файле и выполнение этого файла может выполнять контроль-C. Работа для меня абсолютно прекрасна.