자동으로 스크립트를 배경으로 이동

자동으로 스크립트를 배경으로 이동

실행 중인 스크립트가 스스로 백그라운드로 이동할 수 있나요?

나는 목표가 있습니다: 나는 스크립트를 실행합니다: ./script.sh. 스크립트에서 비밀번호를 묻습니다.

echo -n PASSWORD:
read -s pass
if [ "${scriptPassword}" == "$pass" ] && [[ ${pass_counter} = 0 ]]; then
pass_counter = $ ((pass_counter + 1))
echo "PASSWORD OK"

Ctrl그런 다음 +를 누른 다음 명령을 실행하는 것과 Z 동일한 효과를 얻고 싶습니다 bg. 스크립트에서 이러한 명령을 실행할 수 있나요?

스크립트가 에서 시작된 것처럼 작동하기를 원 nohup ./script.sh &하지만 사용자가 올바른 비밀번호를 입력한 후에만 가능합니다.

답변1

1. 직접법

이는 다음과 다소 유사합니다.호크 라킨의 답변그러나 더 간단합니다. 스크립트가 대화형 작업을 마치면 다음을 수행하세요.

(kill -STOP $$; kill -CONT $$) &
sleep 1

여기서 스크립트는 +Ctrl 와 매우 유사한 매우 작은(비동기) 하위 쉘을 생성하여 이를 중지(스크립트 프로세스)한 Z다음 다음을 사용합니다.계속되는실제 신호와 매우 유사한 직관적인 신호 bg. 그럴 필요조차 없을 수도 있습니다 sleep. 신호가 들어올 때 스크립트가 중요한 작업을 수행하지 않는 것이 더 안전할 수 있다고 생각합니다.

나는 이것을 테스트했지만 피상적으로만 테스트했기 때문에 실제 애플리케이션 컨텍스트에서 사용하면 놀랄 수도 있습니다.
____________
* 차이점은 Ctrl+ ZSIGTSTP 전송입니다. 스크립트에서 SIGSTOP 대신 SIGTSTP를 사용할 수 있습니다. SIGSTOP으로 테스트했는데 작동한다면 변경할 이유가 없습니다.

2. 아마도 더 간단할 것입니다(아마도 더 이식성이 높을까요?)

스크립트가 자신을 비동기적으로 호출하도록 합니다.

if [ "$exported_pass" != "$scriptPassword" ]
그 다음에
    [읽으려면 여기에 적절한 코드를 삽입하세요.통과사용자 및 루프에서]
    [적절해질 때까지(또는 너무 많이 시도해서 그만둡니다). ]
    # 그래서 이때는 "$scriptPassword" == "$pass"
    내보낸 패스 = "$passes"
    내보내기 내보내기_패스
    안돼 "$0" "$@" &
    출구
필리핀 제도

스크립트가 처음 실행될 때 $exported_pass설정되지 않으므로 들어가서 if비밀번호 then를 묻습니다. 그런 다음 이를 exported_pass환경 변수에 넣고 자신을 비동기식으로 호출합니다. 그런 다음 기본(부모) 프로세스가 종료됩니다. 스크립트에 대한 두 번째 호출은 백그라운드에서 실행되고 환경에서 비밀번호를 확인한 후 작업을 계속합니다.

답변2

스크립트가 실행될 수 있도록 스크립트를 실행하기 전에 상위 셸에 트랩을 설정할 수 있습니다 bg. 문제는 스크립트가 실행될 때 트랩이 실행되지 않는다는 것입니다.

터미널이 SIGSTOP스크립트로 전송된 후(그 후 상위 쉘이 다시 제어권을 갖음) 트릭은 스크립트가 이 작업을 스스로 수행하도록 하는 것입니다.

# preparation in the parent shell
trap 'bg %%' USR1

스크립트:

#! /bin/bash

# parent shell has executed: trap 'bg %%' USR1

# pass or determine this value
PARENT_SHELL_PID=5646

read -p "enter value: " input
kill -USR1 $PARENT_SHELL_PID # execution of this in parent shell is delayed
kill -STOP $$ # returns control to parent shell

sleep 1000

래퍼 스크립트를 찾고 있습니다.

두 개의 스크립트를 가져와 그 중 하나를 얻을 수 있다면 더 쉬울 것입니다(즉, 하위 쉘이 아닌 현재 쉘의 컨텍스트에서 실행).

래퍼 스크립트:

PARENT_SHELL_PID=$$ ./script.sh
bg %%

실제 스크립트:

#! /bin/bash

test -z "$PARENT_SHELL_PID" && exit 2

read -p "enter value: " input

# return control to sourced wrapper script
kill -STOP $$

# continue in the background
sleep 1000

둘 다 실행

. wrapper.sh

답변3

가능합니까?이동하다백그라운드 셸용 스크립트를 실행 중이신가요?

'모바일'이라는 단어를 사용하면 혼란스럽습니다. 당신은 아마도 다른 동사를 언급하고 있을 것입니다(어떤 동사인지 추측할 수 없습니다). 나는 그것을 말 그대로 받아들입니다 ...

쉘 스크립트딱 하나만문서(그리고프로세스스크립트를 해석하기 위해 다음을 수행할 수 있습니다.일부프로세스 또는 스크립트 실행 여부). 당신은 그것을 이동할 수 있습니다 (사용하여mv(1)또는 사용이름 바꾸기(2)일부 프로그램에서는) 실행되는 동안. 그러나 그것을 해석하는 쉘은 일부를 열었습니다.파일 설명자그게 다야, 아무것도 바뀌지 않습니다. 실제로,당신은 스크립트를 이동하고 싶지 않아요(프로세스나 작업은 이동할 수 없지만 파일은 이동할 수 있습니다.) "이동" 동사는 매우 혼란스럽고(적어도 나에게는 영어가 모국어가 아닙니다) 당신이 정말로 원하는 것이 무엇인지, 그 이유가 무엇인지 이해가 되지 않습니다.

(또 다른 문제는씌우다스크립트가 실행되는 동안에는 이에 대해 묻지 않을 것입니다)

일부 프로그램이 (가짜) 터미널 내부에서 사용자의 동작을 모방하기를 원하는 것 같습니다. 읽다tty가 공개됐다페이지(터미널과 의사 터미널은 매우 복잡하여 세부 사항을 잊어버렸습니다). 사용예상되는터미널 내에서 사용자를 가장합니다.

그런데, 스크립트에서 비밀번호를 관리하는 것은 위험합니다(보안 취약점만들기도 매우 쉽고) 실수하기 쉬우므로 냄새가 매우 불쾌합니다. 예를 들어 ssh공개 키와 개인 키를 사용하여 이를 방지하려고 합니다 .

따라서 (스크립트 내에서) 비밀번호가 자동으로 제공되지 않도록 전체 시스템을 다시 설계하는 것이 좋습니다.

분명히 이 작업을 수행하고 싶을 것입니다(그러나 터미널에서 직접 수행할지 아니면 다른 스크립트 내에서 수행할지 확실하지 않습니다).

CTRL+Z

 bg %%

이것은 대략직업 통제. 백그라운드에서 실행되는 것은 쉘이나 스크립트를 해석하는 기타 일반 실행 프로그램을 실행하는 프로세스라는 사실은 부적합합니다.유닉스 쉘커널의 관점에서 보면 이는 정상적인 프로그램입니다. IIRC, 직무 통제 vs.프로세스 그룹.

댓글에서 특정 데이터베이스에 연결한다고 언급하셨습니다. 최대관계형 데이터베이스 관리 시스템클라이언트 프로그램은 보다 적절한 방식으로 비밀번호를 제공하는 방법을 제공합니다(아마도--login-pathmysql명령 용). 다른 스크립트에서 이 작업을 수행하려는 경우여기 문서편할 수도 있겠네요(여기 문서일부 SQL 명령을 포함하거나 합성할 수 있습니다. 또한 RDBMS 시스템은 인증이 실패하더라도 데이터베이스를 변경하지 않는다는 점에 유의하십시오.

스크립트에서 이러한 명령을 실행할 수 있나요?

bg %%스크립트에서 어떤 명령을 실행하려는지 이해할 수 없습니다(예). 스크립트에서 작업 제어를 실행하고 싶다면(하지만 그렇게 해서는 안 된다고 생각합니다), 이것이 expect더 적절할 수 있습니다.

스크립트가 작동하기를 원 nohup ./scripts.sh &하지만 올바른 비밀번호를 입력한 후에만 가능합니다.

그 편집자나를 혼란스럽게 한다심지어. 어떤 비밀번호에 대해 이야기하고 있습니까(귀하의 스크립트가 일부 RDBMS 서버에 대한 비밀번호를 제공하는지 또는 완전히 작동하려면 비밀번호가 필요한지 확실하지 않습니다)?내 생각엔데이터베이스 관련 작업(예: 몇 시간 동안 지속되는 백업)을 수행하는 일부 장기 실행 스크립트가 있습니다. 그렇다면 다른 질문을 해야 합니다. 예를 들어, (대화형으로 입력된) 비밀번호를 어딘가에 저장한 다음 일괄적으로 백업을 실행할 수 있습니다(아마도 다음을 사용하여).batch좀 주문해여기 문서). 그런데, 다양한 RDBMS에는 비밀번호를 제공하고 인증을 수행하는 방법이 다르므로 향후 질문에서 사용 중인 실제 RDBMS를 언급해야 합니다.

따라서 더 많은 동기를 부여하고 더 많은 맥락을 제공하도록 질문을 개선하는 것을 고려하십시오. 그냥 추측일 뿐이고 틀릴 수도 있어요!

아니면 다음과 같은 것을 원할 수도 있습니다.데몬(3)당신의 껍질에? 이것은 또 다른 질문을 제기합니다 (bash는무료 소프트웨어, 언제든지 패치하여 새 항목을 추가할 수 있습니다.내장내부에). 라고 생각합니다(근데 전혀 모르겠음)exec쉘 내장이 유용할 수 있습니다.

관련 정보