지연과 함께 백그라운드에서 명령을 실행하는 방법은 무엇입니까?


33

누군가이 작업을 수행하는 프로그램을 만드는 방법을 보여 줄 수 있습니까? 5 분 후

echo "80" > /sys/class/leds/blue/brightness

나는이 프로그램을 백그라운드에서 ( rngd서비스 와 같은 ) 백그라운드에서 실행하기를 원합니다 . 리눅스에 대해 많이 알지 못하기 때문에 이것을 할 수 없습니다.

답변:


50
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &

이렇게하면 스크립트가 계속 작동하거나 즉시 제어권을 복원 할 수 있습니다. 스크립트의 새로운 백그라운드 작업 은 sleep 및 echo라는 두 가지 명령으로 시작됩니다.

일반적인 오류 중 하나를 제공하기 위해 노력하고있다 sleep거나 echo또는 둘 모두 &하는하지 않습니다 작업 의도 한대로. 일련의 명령을 실행 ()하면 별도의 셸 프로세스에서 명령이 생성되고을 사용하여 전체를 백그라운드로 보낼 수 있습니다 &.


그 위트에 내가 적극적으로 유용하다는 것을 알았습니다. 임베디드 장치에는 워치 독과 작동하는 주요 응용 프로그램이 있습니다. 시작 후 곧바로 워치 독 재설정을 트리거하는 방식으로 실패하면 반복적으로 OS 시작과 재설정 사이의 기간이 매우 짧아서 원격으로 수정하기가 어렵습니다. 따라서 시스템이 너무 빨리 다시 시작되었는지 확인하고 지연이 발생하면 수동으로 해결할 시간을 줄 수있는 방법이 필요합니다.

 [ -f /tmp/startdelay ] && sleep 30
 touch /tmp/startdelay
 ( sleep 30 ; rm /tmp/startdelay ) &
 [ -f /tmp/noautostart ] && exit 0
 start_app

로그인 touch /tmp/noautostart하고 메인 앱을 수행 하면 시작되지 않습니다. 워치 독이 시작되고 rm /tmp/startdelay수행되지 않으며 다음에 시스템이 시작될 때 30 초가 더 걸리게됩니다. 그렇지 않으면 지연없이 재시동이 빠릅니다.


예, 동의하지만 이는 또한 사용자 반영의 일부일 수 있습니다 ;-)
Kiwy

다른 답변은 "in background"부분을 놓친 것 같습니다. 아니, 나는 그것에 대해 꽤 명백했다 : /
goldilocks

@ goldilocks : 답을 게시 한 후에 만 ​​배경 부분에 보내는 것을 추가했습니다.
SF.

아니, 내 원래의 대답은 수면 &을 배경으로 수면을 포함하는 함수를 실행하는 것이 었습니다 . "수면도 배경을해야한다" 는 처음부터 첫 줄에 있었다. 나를 믿지 않으면 편집 기록을보십시오. 그리고 내 대답은 당신보다 5 분 더
늙었다

1
@gekannt : ... 어, 문제는 " 지연 적으로 백그라운드에서 명령을 실행하는 방법 "입니다. -그렇지 않으면 어떻게 달성하겠습니까? (아니요, 만약 당신이 ()그룹을 배경으로하지 않는다면 , 생성 된 쉘이 끝날 때까지 원래 쉘은 일시 중지됩니다.)
SF.

11

at명령을 사용

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min

백그라운드에서 실행됩니다


2
이것이 올바른 방법이지만 atd 데몬이 실행되고 대부분의 시스템에는 패키지가 설치되어 있어야합니다.
율리우스

작은 따옴표를 사용하여 이스케이프를 피하고 echoheredoc 또는 herestring을 사용하여 전체를 포기할 수 있습니다.
Chris Down

@Julian at은 표준 POSIX 명령입니다. 어떤 유닉스 계열 시스템은 기본적으로 사용할 수 없습니까?
Stéphane Chazelas

1
@ StéphaneChazelas-좋은 질문입니다. 나는이 문제가 있었다는 것을 알고 있지만 얼마 전이었다. 나는 약간의 검사를했고 at 명령은 꽤 보편적 인 것처럼 보입니다. 또한 atd는 Linux마다 다르며 일부 Linux 시스템에서도 BSD 스타일 cron 데몬으로 대체 될 수 있습니다. 내 의견이 구식이라고 생각합시다.
Julian

나는 '에서'시도하고 어떤 명령은 안드로이드 8 찾을 수 없습니다
beppe9000

6

5 분 안에 무언가를 실행하고 싶지만 나머지 프로그램을 계속 (또는 마치려면) 수면을 배경으로해야합니다.

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

인쇄 hello한 다음 3 초 후에 (기본 프로그램이 종료 된 후) print 인쇄 world합니다.

중요한 부분은 &함수 실행을 백그라운드로 포크하는 것입니다.


1
runWithDelay () { sleep $1; "${@:2}"; }대신 제안해도 될까요?
manatwork

1
doWhateverWithDelay 3 &두 번째 예제에서 읽어야한다고 생각합니다 .
Baarn

@manatwork : 건배.
goldilocks

1
@goldilocks, 사용의 필수 요소 $@는 인용 할 수 있고 인용 단어 목록으로 확장됩니다. 그래서 더 잘하십시오 "$@"(또는 "${@}"중괄호를 좋아한다면). pastebin.com/MU7hbB2C
manatwork를

@manatwork : Point taken;) echo ( -n) 와 함께 args를 사용하여 시도 했지만 분명히 순진합니다.
goldilocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.