잠자는 bash 스크립트를 어떻게 깨울 수 있습니까?


27

sleep명령을 사용하여 일시 중지 된 프로세스를 깨울 수 있습니까?


예를 들어,이 스크립트가 있다고 가정 해 봅시다.

#!/bin/bash
echo "I am tired"
sleep 8h
echo "I am fresh :)"

30 분 후 스크립트를 중지해야한다는 것을 알게되었습니다. 즉, sleep 30m대신 작성했으면 합니다.

마지막 명령이 실행되지 않고 계속 피곤하기 때문에 +를 kill PID누르거나 Ctrl+를 누르지 않으려 C고합니다.

프로세스를 깨우 sleep거나 깨우기를 지원하는 다른 명령을 사용 하는 방법이 있습니까? 백그라운드 및 포 그라운드 프로세스에 대한 솔루션을 환영합니다.


13
정말 큰 소리로 들립니다.
Doorknob

2
@Doorknob gawking은 실제로 작동하지 않습니다. 내가 마지막으로 sleeping 과정을 가졌을 때 , 나는 pushd침대에서 벗어났다.
imallett

스크립트에 #!줄 이 없습니다 . 그리고 문제가 귀하의 질문에 대한 대답은 어떤 존재 여부에 따라 달라질 수 있기 때문 -e에서 #!라인.
kasperd

1
@kasperd 님. 호기심에서 -e 플래그는 어떤 영향을 미칩니 까?
Bittenus

2
기본적으로 스크립트는 오류 후에 계속됩니다. 를 사용 #!/bin/bash -e하면 오류 후 스크립트가 중지됩니다. sleep 명령을 단순히 종료하면 bash에서 오류로 처리됩니다. 그것은 -e당신의 질문에 아주 간단한 대답이 없다는 것을 의미 합니다. 사용 된 경우 -e절전 프로세스를 종료하지 않고 중지해야하므로 훨씬 어려워집니다.
kasperd

답변:


47

배쉬 스크립트가 실행되면 sleep, 여기가 무엇 pstree과 같을 수 있습니다

bash(10102)───sleep(8506)

스크립트로 실행할 때도 프로세스 ID (PID)가 있습니다. 수면을 중단하고 싶다면 kill 8506Bash 세션을 재개하십시오. 문제는 스크립트 환경에서 sleep명령 의 PID를 모르고 프로세스를 살펴볼 사람이 없습니다. 나무.

$$매직 변수를 통해 Bash 세션의 PID를 얻을 수 있습니다 . 이를 어딘가에 저장할 수 있으면 해당 PID 아래 에서 sleep실행중인 인스턴스를 대상으로 지정할 수 있습니다 . 스크립트에 넣은 내용은 다음과 같습니다.

# write the current session's PID to file
echo $$ >> myscript.pid

# go to sleep for a long time
sleep 1000

그런 다음 PID 아래에서 실행되는 인스턴스 pkill를 핵화하도록 지시 할 수 있습니다 sleep.

pkill -P $(<myscript.pid) sleep

다시 말하지만, 이것은 sleep하나의 Bash 세션에서 직접 실행되는 프로세스 로만 제한됩니다 . PID가 올바르게 기록되어 있으면 killall sleep또는 보다 안전 하여 시스템의 모든 프로세스를 pkill sleep방해 sleep있습니다 (허용 허용).

우리는 다음 예제를 통해 이론을 증명할 수 있는데, 여기서 우리는 세 개의 별도 bash 세션이 있고 두 개는 실행 중 sleep입니다. 우리는 왼쪽 상단 bash 세션의 PID를 지정하기 때문에 단지 sleep죽습니다.

여기에 이미지 설명을 입력하십시오


다른 방법은 sleep백그라운드 로 푸시 하고 PID를 저장 한 다음 포 그라운드로 되 돌리는 것입니다. 스크립트에서 :

sleep 1000 &
echo $! > myscript.sleep.pid
fg

그리고 그것을 죽일 :

kill $(<myscript.sleep.pid)

5

kill 등의 다른 신호를 처리 ( "트랩")하기 위해 스크립트를 작성할 수 있으므로 필요에 따라 스크립트 동작을 수정할 수 있습니다. 남자 배쉬 참조 :

SIGNALS
   When  bash  is  interactive,  in the absence of any traps, it ignores SIGTERM (so that kill 0 does not
   kill an interactive shell), and SIGINT is caught and handled (so that the wait builtin  is  interrupt-
   ible).   In all cases, bash ignores SIGQUIT.  If job control is in effect, bash ignores SIGTTIN, SIGT-
   TOU, and SIGTSTP.

   Non-builtin commands run by bash have signal handlers set to the values inherited by  the  shell  from
   its  parent.   When  job  control is not in effect, asynchronous commands ignore SIGINT and SIGQUIT in
   addition to these inherited handlers.  Commands run as a result of  command  substitution  ignore  the
   keyboard-generated job control signals SIGTTIN, SIGTTOU, and SIGTSTP.

   The shell exits by default upon receipt of a SIGHUP.  Before exiting, an interactive shell resends the
   SIGHUP to all jobs, running or stopped.  Stopped jobs are sent SIGCONT to ensure that they receive the
   SIGHUP.   To  prevent the shell from sending the signal to a particular job, it should be removed from
   the jobs table with the disown builtin (see SHELL BUILTIN COMMANDS below) or  marked  to  not  receive
   SIGHUP using disown -h.

   If  the huponexit shell option has been set with shopt, bash sends a SIGHUP to all jobs when an inter-
   active login shell exits.

   If bash is waiting for a command to complete and receives a signal for which a trap has been set,  the
   trap  will not be executed until the command completes.  When bash is waiting for an asynchronous com-
   mand via the wait builtin, the reception of a signal for which a trap has been set will cause the wait
   builtin  to  return immediately with an exit status greater than 128, immediately after which the trap
   is executed.

4

스크립트의 다음 줄로 계속 잠들 수 있습니다.

pkill sleep

이렇게하면 스크립트뿐만 아니라 시스템에서 실행중인 모든 절전 프로세스가 종료됩니다.


1

cron부팅시 슬리핑 bash 스크립트가 시작되었습니다 . 이 스크립트는 1 분마다 작동하며 인터넷에서 얻은 일출 및 일몰을 기반으로 랩톱 디스플레이 밝기를 설정합니다. 완전 밝기와 완전 밝기 사이에서 사용자가 구성 할 수있는 전환 단계는 3 분, 4 분, 5 분 또는 1 분마다 계산되는 값만큼 스텝 업 및 스텝 다운해야합니다.

Oli pstree는 그의 답변에서 간단히 언급 했지만 모든 sleep인스턴스를 죽일 것이기 때문에 거부했습니다 . pstree 옵션을 사용하여 검색 범위를 좁 히면이를 피할 수 있습니다.

사용하여 pstree -h우리가 전체 계층 구조를 참조하십시오

$ pstree -h
systemd─┬─ModemManager─┬─{gdbus}
                      └─{gmain}
        ├─NetworkManager─┬─dhclient
                        ├─dnsmasq
                        ├─{gdbus}
                        └─{gmain}
        ├─accounts-daemon─┬─{gdbus}
                         └─{gmain}
        ├─acpid
        ├─agetty
        ├─atd
        ├─avahi-daemon───avahi-daemon
        ├─cgmanager
        ├─colord─┬─{gdbus}
                └─{gmain}
        ├─cron───cron───sh───display-auto-br───sleep
        ├─cups-browsed─┬─{gdbus}
                      └─{gmain}
        ├─dbus-daemon
        ├─fwupd─┬─3*[{GUsbEventThread}]
               ├─{fwupd}
               ├─{gdbus}
               └─{gmain}
        ├─gnome-keyring-d─┬─{gdbus}
                         ├─{gmain}
                         └─{timer}
        ├─irqbalance
        ├─lightdm─┬─Xorg───3*[{Xorg}]
                 ├─lightdm─┬─upstart─┬─at-spi-bus-laun─┬─dbus-daemon
                                                    ├─{dconf worker}
                                                    ├─{gdbus}
                                                    └─{gmain}
                                   ├─at-spi2-registr─┬─{gdbus}
                                                    └─{gmain}
                                   ├─bamfdaemon─┬─{dconf worker}
                                               ├─{gdbus}
                                               └─{gmain}
                                   ├─chrome─┬─2*[cat]
                                           ├─chrome─┬─chrome─┬─2*[chrome─┬─{Chrome_ChildIOT}]
                                                                      ├─5*[{CompositorTileW}]]
                                                                      ├─{Compositor}]
                                                                      ├─{GpuMemoryThread}]
                                                                      ├─{MemoryInfra}]
                                                                      ├─{Renderer::FILE}]
                                                                      ├─{TaskSchedulerRe}]
                                                                      └─{TaskSchedulerSe}]
                                                           ├─7*[chrome─┬─{Chrome_ChildIOT}]
                                                                      ├─5*[{CompositorTileW}]]
                                                                      ├─{Compositor}]
                                                                      ├─{GpuMemoryThread}]
                                                                      ├─{MemoryInfra}]
                                                                      ├─{Renderer::FILE}]
                                                                      ├─{ScriptStreamerT}]
                                                                      ├─{TaskSchedulerRe}]
                                                                      └─{TaskSchedulerSe}]
                                                           ├─chrome─┬─{Chrome_ChildIOT}
                                                                   ├─5*[{CompositorTileW}]
                                                                   ├─{Compositor}
                                                                   ├─{GpuMemoryThread}
                                                                   ├─{Media}
                                                                   ├─{MemoryInfra}
                                                                   ├─{Renderer::FILE}
                                                                   ├─{ScriptStreamerT}
                                                                   ├─{TaskSchedulerRe}
                                                                   └─{TaskSchedulerSe}
                                                           └─2*[chrome─┬─{Chrome_ChildIOT}]
                                                                       ├─5*[{CompositorTileW}]]
                                                                       ├─{Compositor}]
                                                                       ├─{GpuMemoryThread}]
                                                                       ├─{Renderer::FILE}]
                                                                       ├─{ScriptStreamerT}]
                                                                       ├─{TaskSchedulerRe}]
                                                                       └─{TaskSchedulerSe}]
                                                   └─nacl_helper
                                           ├─chrome─┬─chrome
                                                   ├─{Chrome_ChildIOT}
                                                   ├─{MemoryInfra}
                                                   ├─{TaskSchedulerSe}
                                                   └─{Watchdog}
                                           ├─{AudioThread}
                                           ├─{BrowserWatchdog}
                                           ├─{Chrome_CacheThr}
                                           ├─{Chrome_DBThread}
                                           ├─{Chrome_FileThre}
                                           ├─{Chrome_FileUser}
                                           ├─{Chrome_HistoryT}
                                           ├─{Chrome_IOThread}
                                           ├─{Chrome_ProcessL}
                                           ├─{Chrome_SyncThre}
                                           ├─{CompositorTileW}
                                           ├─{CrShutdownDetec}
                                           ├─{D-Bus thread}
                                           ├─{Geolocation}
                                           ├─{IndexedDB}
                                           ├─{LevelDBEnv}
                                           ├─{MemoryInfra}
                                           ├─{NetworkChangeNo}
                                           ├─{Networking Priv}
                                           ├─4*[{TaskSchedulerBa}]
                                           ├─6*[{TaskSchedulerFo}]
                                           ├─{TaskSchedulerSe}
                                           ├─{WorkerPool/3166}
                                           ├─{WorkerPool/5824}
                                           ├─{WorkerPool/5898}
                                           ├─{WorkerPool/6601}
                                           ├─{WorkerPool/6603}
                                           ├─{WorkerPool/7313}
                                           ├─{chrome}
                                           ├─{dconf worker}
                                           ├─{extension_crash}
                                           ├─{gdbus}
                                           ├─{gmain}
                                           ├─{gpu-process_cra}
                                           ├─{inotify_reader}
                                           ├─{renderer_crash_}
                                           ├─{sandbox_ipc_thr}
                                           └─{threaded-ml}
                                   ├─compiz─┬─{dconf worker}
                                           ├─{gdbus}
                                           ├─{gmain}
                                           └─8*[{pool}]
                                   ├─conky───6*[{conky}]
                                   ├─2*[dbus-daemon]

( .... many lines deleted to fit in 30k limit .... )

        ├─vnstatd
        ├─whoopsie─┬─{gdbus}
                  └─{gmain}
        └─wpa_supplicant

보시다시피 일반적인 우분투 로그인에는 많은 PID (프로세스 ID)가 포함되어 있습니다.

다음을 사용하여 실행중인 스크립트로 좁힐 수 있습니다.

$ pstree -g -p | grep display-auto
  |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(26552,1308)

우리는보다:

  • cron 쉘 시작 (프로세스 ID 1308 및 세션 ID 1308)
  • 쉘은 프로세스 ID 1321 및 세션 ID 1308 (쉘과 일치)에서 실행중인 프로그램을 호출합니다.
  • 우리의 프로그램은 sleep프로세스 ID 26552로 다시 호출 하고 세션 ID 1308을 다시 호출합니다.

이 시점에서 우리는 사용할 수 pkill -s 1308있으며 쉘, 프로그램 display-auto-brightnesssleep명령 을 포함하는 전체 세션을 종료 합니다 . 대신에 우리는 kill 26552프로그램이 깨어나고 밝기를 조정하도록하는 sleep 명령 만 죽일 것 입니다.

터미널에서 수동으로 입력하면 다음과 같습니다.

───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
             |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(32362,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ sudo kill 32362
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
             |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(1279,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ sudo kill 1279
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
             |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(4440,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ 

다음 단계는 노트북이 일시 중단 상태에서 깨어날 때 수행하는 것입니다. 예를 들어 뚜껑을 닫으면 완전히 어두워지고 화면 밝기가 "300"으로 설정되었습니다. 뚜껑을 열면 일광이며 밝기는 "2000"으로 설정해야합니다. 물론 프로그램은 1 ~ 59 초 내에 자체적으로 작동하지만 밝기를 즉시 설정하는 것이 더 편안합니다.

일시 중단 / 재개 코드를 작성한 후 게시합니다. 이번 주말이 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.