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

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

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

이 프로그램이 백그라운드에서 실행되기를 원합니다 (예 : rngd 서비스). Linux에 대해 잘 모르기 때문에이 작업을 수행 할 수 없습니다.

답변

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

그러면 스크립트가 계속 진행되거나 즉시 제어권이 복원되고 새로운 <스크립트의 em> 백그라운드 작업 은 sleep 및 echo의 두 명령으로 시작됩니다.

일반적인 오류는 sleep 또는 echo 또는 둘 다 & 의도 한대로 작동하지 않습니다. ()에서 일련의 명령을 실행하면 별도의 셸 프로세스에서 생성되지만 &를 사용하여 전체를 백그라운드로 보낼 수 있습니다.


그것이 적극적으로 유용하다는 것을 알게되었습니다. 내가 개발 한 임베디드 장치에는 워치 독과 함께 작동하는 메인 애플리케이션이 있습니다. 시작 후 곧바로 워치 독 리셋을 트리거하는 방식으로 실패하면 OS 시작과 시작 사이의 기간으로 원격으로 수정하기가 어렵습니다. 재설정은 매우 짧고 ssh에 충분하지 않으며 앱 시작을 차단합니다. 따라서 시스템이 너무 빨리 다시 시작되었는지 확인하고 지연이 발생한 경우 수동으로 고칠 시간을 줄 방법이 필요합니다.

 [ -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 초가 더 걸립니다. 그렇지 않으면 지체없이 빠르게 다시 시작할 수 있습니다.

댓글

  • 예, 동의하지만 사용자 반영의 일부가 될 수도 있습니다 .-)
  • 다른 답변은 " 백그라운드에서 " 부분을 놓친 것 같습니다. 아니요, 나 그것에 대해 꽤 명시 적이었습니다. : /
  • @goldilocks : 내 답변을 게시 한 후에 만 백그라운드 부분에 보내기를 추가했습니다.
  • 아니요, 원래 답변은 sleep을 포함하는 함수를 실행하는 것이 었습니다. &를 사용하여 수면을 배경으로합니다. " 수면을 배경으로해야합니다. " 는 처음부터 첫 번째 줄에있었습니다. 나를 믿지 못한다면 ' 수정 내역을보세요. 제 대답은 당신의 대답보다 5 분 더 오래되었습니다 : P
  • @gekannt : … 어, 질문은 " 어떻게 배경 에 지연이 있습니까? "-그렇지 않으면 어떻게 달성 하시겠습니까? (아니요, ' () 그룹을 배경으로하지 않으면 생성 된 쉘이 완료 될 때까지 원래 쉘이 일시 중지됩니다.)

답변

at 명령 사용

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

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

댓글

  • 올바른 방법입니다. 하지만 atd 데몬이 실행되어야하며 대부분의 시스템에서 패키지가 설치되어 있어야합니다.
  • 이스케이프를 방지하기 위해 작은 따옴표를 사용할 수 있으며 echo 모두 heredoc 또는 herestring을 사용합니다.
  • @Julian, at는 표준 POSIX 명령입니다. 기본적으로 사용할 수없는 Unix 계열 시스템은 ' 무엇입니까?
  • @St é phaneChazelas-좋은 질문 . 저는 '이 문제가 있다는 것을 알고 있지만 얼마 전 일입니다. 나는 약간의 확인을했고 at 명령은 꽤 유비쿼터스처럼 보입니다. 또한 atd는 Linux 전용이며 일부 Linux 시스템에서도 BSD 스타일 cron 데몬으로 대체 될 수 있습니다. ' 내 댓글이 오래된 것으로 간주하겠습니다.
  • '에서 ' 및 Android 8에서 명령을 찾을 수 없음

답변

5에서 실행하려는 경우 분이지만 나머지 프로그램을 계속 (또는 완료)하려면 절전 모드도 백그라운드로 설정해야합니다.

#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello 

이렇게하면 hello 3 초 후 (메인 프로그램이 종료 된 후) world를 인쇄합니다.

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

댓글

  • 대신 runWithDelay () { sleep $1; "${@:2}"; }를 제안해도 될까요?
  • 제 생각에 두 번째 예에서는 doWhateverWithDelay 3 &를 읽어야합니다.
  • @manatwork : Cheers.
  • @goldilocks, 는 인용 할 수 있으며 인용 된 단어 목록으로 확장됩니다. 따라서 "$@" (중괄호가 마음에 들면 "${@}")로 만드는 것이 좋습니다. pastebin.com/MU7hbB2C
  • 를 참조하십시오.

  • @manatwork : Point taken;) echo와 함께 args를 사용하여 시도했습니다 (-n), 분명히 조금 순진했습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다