Linux: запуск сценария после завершения другого

Я прочитал ответ на этот вопрос из этой ссылки в Stackoverflow. .ком. Но я настолько новичок в написании сценариев оболочки, что сделал что-то не так. Ниже приведены мои сценарии:

тестовый скрипт:

#!/bin/csh -f
pid=$(ps -opid= -C csh testscript1)
while [ -d /proc/$pid ] ; do
    sleep 1
done && csh testscript2

exit

тестовый скрипт1:

#!/bin/csh -f
/usr/bin/firefox
exit

тестовый скрипт2:

#!/bin/csh -f
echo Done
exit

Цель состоит в том, чтобы testscript сначала вызывал testscript1; как только testscript1 уже завершится (что означает, что firefox, вызванный в script1, закрыт), testscript вызовет testscript2. Однако я получил этот результат после запуска testscript:

$ csh testscript
Illegal variable name.

Пожалуйста, помогите мне с этой проблемой. Спасибо вперед.


person HuongOrchid    schedule 10.12.2013    source источник


Ответы (3)


Возможно, вы не заметили, что найденные вами скрипты написаны для bash, а не для csh, но вы пытаетесь их обработать с помощью интерпретатора csh.

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

Кажется, вы пытаетесь запустить первый процесс из команды ps. Но в этом случае вам не нужно делать ничего такого сложного — все, что вам нужно, это:

#!/bin/csh
csh testscript1
csh testscript2

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

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

person Jim Lewis    schedule 10.12.2013
comment
Я действительно попробовал файл bash, и он сказал ps: illegal argument: ./testscript1.sh и выполнил testscript2.sh - person HuongOrchid; 11.12.2013
comment
Я обновил свой ответ. Первоначальный сценарий делал что-то совсем другое, чем то, что вам кажется нужным. - person Jim Lewis; 11.12.2013
comment
Спасибо за помощь. Сценарий, который вы мне порекомендовали, хорошо работает в Linux. Я пробовал это раньше в Mac OS X и получил результат, что «Готово» было напечатано сразу после открытия Firefox. И я не пробовал это снова в Linux. В любом случае, работа в Linux — это то, что мне сейчас нужно. Но не могли бы вы объяснить мне, почему это не работает в Mac OS X? Спасибо!!! - person HuongOrchid; 11.12.2013

Я считаю, что эта строка не CSH:

pid=$(ps -opid= -C csh testscript1)

Обычно в csh вы определяете переменные следующим образом:

set pid=...

Я не уверен, что такое синтаксис $(), возможно, обратные тики будут работать как замена:

set pid=`ps -opid= -C csh testscript1`
person woolstar    schedule 10.12.2013
comment
Я попробовал ваше предложение и получил это: ERROR: TTY could not be found. и список вариантов использования ps - person HuongOrchid; 11.12.2013

Пытаться,

приведенный ниже скрипт проверит pid testscript1, если он не найден, он выполнит testcirpt2

 sp=$(ps -ef | grep testscript1 | grep -v grep | awk '{print $2}')
 /bin/ls -l /proc/ | grep $sp > /dev/null 2>&1 && sleep 0 || /bin/csh testscript2
person Ranjithkumar T    schedule 17.12.2013