LINUX.ORG.RU

bash. помогите сформировать команду запуска


0

1

халоу!

к примеру, нужно запустить программу ls.

но нужно запустить ее так, чтоб записать PID запущенной программы в файл. при этом, при завершении команды, так же нужно записать код завершения в файл.

я понимаю как реализовать первый пункт: "(ls) & echo $! > file"

но вот со вторым что-то нефкурю...

благодарен.

★★★

чтонить типа такого

RETCODE=$?
if [ $RETCODE -ne 0 ]; then
    echo "`date +'[%d.%m.%Y %T %:z]'` ERROR: Err. code=$RETCODE"
fi

shrub ★★★★★
()
Ответ на: комментарий от vostrik

в общем - да. как получить код завершения процесса - я вкурсе. сложность была в том, как записать это все в виде одной команды.

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

основной момент, предполагался, в этом?: RETCODE=$?

ну я тебе строчки из своего скрипта написал, так как не думал что тебе в виде одной команды надо

shrub ★★★★★
()
Ответ на: комментарий от vostrik

да, некрасиво получилось :)

а если в один файл надо, то вот так же нормально сработает?

ls; echo "PID "$!" RETURN "$? >> ./file

shrub ★★★★★
()
Ответ на: комментарий от niXman

и попутный вопрос.

при использовании команды: "(ls; echo $? > file1) & echo $! > file2"

в file2 будет записан PID форка bash а не ls, так ведь?

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

зачем тебе форки? ls; echo $! $? >> ./file запишет корректные pid и exit code

vostrik ★★★☆
()
Ответ на: комментарий от shrub

ls; echo «PID »$!" RETURN «$? >> ./file

не подходит. т.к. PID можно получить при живом процессе. а в твоем примере, происходит попытка получить PID мертвого(несуществующего?).

niXman ★★★
() автор топика

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

zolden ★★★★★
()
Ответ на: комментарий от zolden

задача высосана из ваккуума.

нет же. очень даже реальная задача.

зачем тебе это нагромождение костылей на самом деле

ну...процесс запускать.

а что тут является костылем? '$!' и '$?' разве не для того существуют, чтоб их использовать по назначению? или что?

niXman ★★★
() автор топика

но нужно запустить ее так, чтоб записать PID запущенной программы в файл. при этом, при завершении команды, так же нужно записать код завершения в файл.

наверное тебе надо это:

   Coprocesses
       A  coprocess  is  a  shell  command  preceded  by the coproc reserved word.  A coprocess is executed asyn‐
       chronously in a subshell, as if the command had been terminated with the & control operator, with  a  two-
       way pipe established between the executing shell and the coprocess.

       The format for a coprocess is:

              coproc [NAME] command [redirections]

       This  creates a coprocess named NAME.  If NAME is not supplied, the default name is COPROC.  NAME must not
       be supplied if command is a simple command (see above); otherwise, it is interpreted as the first word  of
       the  simple  command.  When the coproc is executed, the shell creates an array variable (see Arrays below)
       named NAME in the context of the executing shell.  The standard output of command is connected via a  pipe
       to  a  file descriptor in the executing shell, and that file descriptor is assigned to NAME[0].  The stan‐
       dard input of command is connected via a pipe to a file descriptor in the executing shell, and  that  file
       descriptor is assigned to NAME[1].  This pipe is established before any redirections specified by the com‐
       mand (see REDIRECTION below).  The file descriptors can be utilized as arguments  to  shell  commands  and
       redirections using standard word expansions.  The process ID of the shell spawned to execute the coprocess
       is available as the value of the variable NAME_PID.  The wait builtin command may be used to wait for  the
       coprocess to terminate.

       The return status of a coprocess is the exit status of command.
drBatty ★★
()
Ответ на: комментарий от niXman

ух ты! не знал о таком.

ожидаемо. Почитай Кнута с его элеватором, а то наломаешь дров.

Штука полезная - к примеру мне нужно сделать коммит, залить в продакшен, и сделать ещё и бекап. Бекап делать долго, и мне лень ждать. Потому этот бекап - сопроцесс. Как и когда он завершится меня волнует мало на данный момент.

vostrik

http://www.opennet.ru/man.shtml?topic=wait&category=1&russian=5

ты не поверишь, у меня нет такой команды и мана к такой команде.

$ which wait
which: no wait in (/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/lib/qt/bin:/usr/share/texmf/bin:.)

выкинь свой ман на помойку.

drBatty ★★
()
Ответ на: комментарий от drBatty

Почитай Кнута

по «Кнут» гуглится много всякой крени. можно ссылочку, плиз ;)

с его элеватором

что в данном случае «элеватор» ?

niXman ★★★
() автор топика
Ответ на: комментарий от drBatty

ты не поверишь, у меня нет такой команды и мана к такой команде.

man wait не пробовал?

vostrik ★★★☆
()
Ответ на: комментарий от niXman

по «Кнут» гуглится много всякой крени. можно ссылочку, плиз ;)

http://www.ozon.ru/context/detail/id/1335648/

есть на рутреккере, но это варез. Я, если честно, не помню, какой именно том, похоже второй.

что в данном случае «элеватор» ?

лифт.

drBatty ★★
()
Ответ на: комментарий от zolden

стесняюсь предположить что у тебя за шелл. это тащемта bash built-in

у меня bash. ссылка на него с цитатой выше.

man wait не пробовал?

вторая секция получается. Нужна таки первая.

drBatty ★★
()
Ответ на: комментарий от drBatty

Штука полезная - к примеру мне нужно сделать коммит, залить в продакшен, и сделать ещё и бекап. Бекап делать долго, и мне лень ждать. Потому этот бекап - сопроцесс. Как и когда он завершится меня волнует мало на данный момент.

Бред, мягко говоря. Зачем тут сопроцесс? Вся фишка сопроцесса, в том что его stdin и stdout привязан (доступен) главному процессу и т.о. позволяет им взаимодействовать, в отличие от банального выполнения в фоне (&). Твой бекап можно просто запустить в фоне.

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 2)
Ответ на: комментарий от sdio

Бред, мягко говоря. Зачем тут сопроцесс? Вся фишка сопроцесса, в том что его stdin и stdout привязан (доступен) главному процессу и т.о. позволяет им взаимодействовать, в отличие от банального выполнения в фоне (&). Твой бекап можно просто запустить в фоне.

ты код видел? Если-бы я просто в фоне запустил, то мне-бы это было-бы мягко говоря неудобно. Мне два процесса нужны _сразу_, и я не знаю заранее, когда какой завершится. И с каким результатом. Потому-то они и работают вместе.

Сам скрипт заканчивается тогда, когда оба процесса завершаться.

Хотя и признаю, пример простенький, но на самом деле - это удобно.

drBatty ★★
()
Ответ на: комментарий от drBatty

Сам скрипт заканчивается тогда, когда оба процесса завершаться.

Достаточно wait в конце родительского скрипта.

sdio ★★★★★
()
Ответ на: комментарий от drBatty

ну можно было-бы

Ну я вообще к тому, что за десять лет админства у меня как-то не сложилась ситуация для их использования в скриптах.

sdio ★★★★★
()
Ответ на: комментарий от sdio

Ну я вообще к тому, что за десять лет админства у меня как-то не сложилась ситуация для их использования в скриптах.

потому-то я и отправил к Кнуту - дедушка пишет, что эта ситуация возникает только в очень сложных случаях, и он устал подыскивать простой пример (какой-то замороченный лифт).

У меня ситуация тоже намного сложнее. Но поля слишком узки.

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.