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

Как установить имя процесса оболочки script?

Можно ли установить имя процесса оболочки script? Это необходимо для уничтожения этого script с помощью команды killall.

4b9b3361

Ответ 1

Здесь способ сделать это, это хак/обходной путь, но он работает очень хорошо. Не стесняйтесь настраивать его на свои нужды, для этого, безусловно, нужны некоторые проверки создания символической ссылки или использования папки tmp, чтобы избежать возможных условий гонки (если они в вашей ситуации проблематичны).

Демонстрация

обертка

#!/bin/bash
script="./dummy"
newname="./killme"

rm -iv "$newname"

ln -s "$script" "$newname"

exec "$newname" "[email protected]"

фиктивная

#!/bin/bash
echo "I am $0"
echo "my params: [email protected]"

ps aux | grep bash

echo "sleeping 10s... Kill me!"
sleep 10

Протестируйте его, используя:

chmod +x dummy wrapper
./wrapper some params

В другом терминале убейте его, используя:

killall killme

Примечания

Убедитесь, что вы можете писать в текущей папке (текущий рабочий каталог).

Если ваша текущая команда:

/path/to/file -q --params somefile1 somefile2

Задайте переменную script в оболочке в /path/to/file (вместо./dummy) и вызовите wrapper, как это:

./wrapper -q --params somefile1 somefile2

Ответ 2

Насколько я знаю, вы не можете сделать это надежно и переносимо. В некоторых разновидностях Unix, изменение того, что в argv [0], сделает работу. Я не верю, что есть способ сделать это в большинстве оболочек.

Вот несколько ссылок на эту тему.

Ответ 3

Вы можете использовать команду kill на PID, чтобы вы могли сделать что-то в фоновом режиме, получить его идентификатор и убить его

PID последнего запуска задания в фоновом режиме можно получить с помощью $!.

echo test & echo $!

Ответ 4

В Linux, по крайней мере, killall dvb работает, хотя dvb представляет собой оболочку script с меткой #!. Единственный трюк - сделать исполняемый файл script и вызвать его по имени, например,

dvb watch abc write game7 from 9pm for 3:30

Запуск ps показывает процесс с именем

/usr/bin/lua5.1 dvb watch ...

но killall dvb снимает его.

Ответ 5

% 1,% 2... также выполняют адекватную работу:

#!/bin/bash
# set -ex

sleep 101 &
FIRSTPID=$!
sleep 102 &
SECONDPID=$!

echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")
kill %2
echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")
sleep 1
kill %1
echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")

Ответ 6

Это очень старый пост. Уверен, что оригинальный постер получил свой ответ давно. Но для новичков думал, что я объясню свой собственный опыт (после полчаса игры с bash). Если вы запускаете скрипт по имени скрипта с чем-то вроде:

./script.sh

имя процесса, указанное ps, будет "bash" (в моей системе). Однако, если вы запускаете скрипт, вызывая bash напрямую:

/bin/bash script.sh /bin/sh script.sh bash script.sh

в итоге вы получите имя процесса, содержащее имя скрипта. например.:

/bin/bash script.sh

приводит к имени процесса с тем же именем. Это может быть использовано для пометки pids с определенным именем скрипта. И это может быть полезно (например) для использования команды kill, чтобы остановить все процессы (по pid), которые имеют имя процесса, содержащее указанное имя сценария.

Ответ 7

Erm... если я не понимаю вопрос, имя оболочки script - это то, что вы назвали файлом. Если ваш script имеет имя foo, тогда killall foo его убьет.