Как установить имя процесса сценария оболочки? - PullRequest
23 голосов
/ 19 июня 2010

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

Ответы [ 7 ]

22 голосов
/ 19 июня 2010

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

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

rm -iv "$newname"

ln -s "$script" "$newname"

exec "$newname" "$@"

пустышка

#!/bin/bash
echo "I am $0"
echo "my params: $@"

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 голосов
/ 19 июня 2010

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

Вот несколько ссылок по теме.

1 голос
/ 19 июня 2010

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

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

echo test & echo $!

0 голосов
/ 23 марта 2019

Это на самом деле очень просто и очень гибко.

Следующая команда превратит скрипт в фоновый режим с процессом, имеющим пользовательское имя процесса CUSTOM-NAME:

( exec -a "CUSTOM-NAME" /bin/bash ) </path/to/script.sh &

Несколько заметок:

  • ps не сможет ссылаться на процесс как CUSTOM-NAME - он будет внутренне видеть его как bash, даже если он будет отображаться как CUSTOM-NAME. Итак, команда

    ps h -C "CUSTOM-NAME" -o pid=
    

    не вернет PID этого процесса. Чтобы получить PID по имени, потребуется следующее (следите за вашей версией grep - она ​​должна поддерживать PCRE, чтобы это работало!):

    ps h -C bash -o pid= -o cmd= | grep -m1 -oP "[0-9]+(?=\s+CUSTOM-NAME)"
    
  • Важно заставить bash прочитать весь сценарий из stdin при запуске, чтобы любое перенаправление файлового дескриптора внутри скрипта не влияло на чтение сценария. Сделайте это, заключите весь скрипт в {} следующим образом:

    ( exec -a "CUSTOM-NAME" /bin/bash ) <<EOF &
    {
     $(cat /path/to/script.sh)
    }
    EOF
    
0 голосов
/ 22 декабря 2015

% 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}\) ")
0 голосов
/ 19 июня 2010

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

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

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

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

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

0 голосов
/ 19 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...