[Решено]запустить процесс и тут же остановить

Автор su16, 09 декабря 2015, 09:06:50

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

su16

Добра!

надо одной строчкой запустить какой-нибудь процесс сразу в состоании саспенда.
идея крупными мазками выглядит так:


ping localhost &
kill -STOP $!

как это одной строкой сделать?
тут ругается, что нельзя вторую команду выполнить, если первая с & на конце.

ping localhost & && kill -STOP $!
Если вам дают бесплатное, то, скорее всего, товар - это вы.
https://occupyflash.org/

vic5710

#1
Цитата: su16 от 09 декабря 2015, 09:06:50ping localhost & && kill -STOP $!
в скобках попробуйте

(ping localhost &)

su16

#2
не работает

(ping localhost &) && (kill -s SIGSTOP $!)
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
...


(ping localhost &) && kill -STOP $!
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
...

процесс в скобках померает раньше исполнения второй команды

вот ещё простой пример для понимания проблемы
((sleep 2;nano) &)
Получен SIGHUP или SIGTERM

процесс помер через 2 секунды... а без скобок работает в бекграунде
(sleep 2;nano) &
Если вам дают бесплатное, то, скорее всего, товар - это вы.
https://occupyflash.org/

vic5710

#3
kill нужен pid процесса ЕМНИП
Цитата: su16 от 10 декабря 2015, 00:13:20(ping localhost &) && kill -STOP $!
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
...
работают фигурные скобки:

{ ping localhost & } && kill -STOP $!


Cообщение объединено 10 декабря 2015, 18:58:08

а вообще оптимально через пробел - не создаются лишние шеллы:

ping localhost& kill -STOP $!

su16

#4
vic5710, Спасибо, оба варианта работают.

не знал я  про тонкости скобок. вот тут про них. кстати, в твоём варианте с { } дополнительные шелы тоже не создаются:
Цитировать
    ( list )
    Placing a list of commands between parentheses causes a subshell environment to be created (see Command Execution Environment), and each of the commands in list to be executed in that subshell. Since the list is executed in a subshell, variable assignments do not remain in effect after the subshell completes.
    { list; }
    Placing a list of commands between curly braces causes the list to be executed in the current shell context. No subshell is created. The semicolon (or newline) following list is required.
потому PID и не пробрасывался у меня, что я юзал круглые...

фокус с пробелом работает потому что & считается разделителем, как и ; и &&
Цитировать
A list is a sequence of one or more pipelines separated by one of the operators ';', '&', '&&', or '||', and optionally terminated by one of ';', '&', or a newline.

поправьте, если не так понял.
Если вам дают бесплатное, то, скорее всего, товар - это вы.
https://occupyflash.org/

vic5710

#5
http://linux.yaroslavl.ru/docs/conf/gnu-util/bash/bash_ug.html
( ) - порождают субшелл
{ } - выполняются в контексте текущего шелла


Cообщение объединено 10 декабря 2015, 21:15:50

насчет разделителя не знаю, видел в мане.
вообще в bash лучше писать просто, ошибки искать замаешься

Cообщение объединено 10 декабря 2015, 21:24:45

я так понял, что у тебя в исходном варианте было & && - два разделителя подряд, поетому и была ошибка
операторы && и || - это if-then-else

touch myfile
[ -f myfile ] && echo OK || echo ERROR
OK
rm myfile
[ -f myfile ] && echo OK || echo ERROR
ERROR