Подтвердить что ты не робот

Как отправить управление + c из bash script?

Я запускаю несколько экранов в bash script, а затем запускаю команду django runserver в каждом из них. Я хотел бы также программно остановить их всех, что требует от меня отправить Control+c в runserver.

Как я могу отправить эти нажатия клавиш из моего bash script?

4b9b3361

Ответ 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. Работа для меня абсолютно прекрасна.