crontab의 항목을 업데이트하는 코드 조각을 스크립트에 추가하려고 합니다. 지금까지 나는 다음과 같은 작업을 해왔습니다.
crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -
목표는 이를 여러 스크립트에서 실행하는 것입니다. 모든 스크립트는 $VAR을 기반으로 자체 행을 찾아 업데이트합니다.
예를 들어:
스크립트 1
#!/bin/bash
VAR="home1"
crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -
echo "Hi"
exit 0
스크립트 2
#!/bin/bash
VAR="home2"
crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -
echo "Hi"
exit 0
내가 추가하고 싶은 것은 이러한 스크립트가 다음 crontab을 생성하도록 하는 것입니다.
0 */2 * * * /root/home1/script > /dev/null 2>&1
0 */2 * * * /root/home2/script > /dev/null 2>&1
어떤 이유로 마지막 실행이 모든 항목을 덮어씁니다.
어떤 팁이 있나요? 감사합니다!
답변1
파일이나 표준 입력을 사용하여 crontab을 구성하면 이미 존재할 수 있는 콘텐츠에 추가하는 대신 콘텐츠를 새로 생성(덮어쓰기)합니다.
간단한 해결책은 각 항목을 파일에 쓰는 것입니다.
crontab -u root -l | grep -w "$VAR" | crontab -u root - && \
{ crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } \
>> cron-entry-file
그런 다음 모든 항목을 수집한 후 다음을 한 번만 수행하십시오.
crontab -u root cron-entry-file
다른 스크립트 및/또는 다른 시간에 항목을 생성하는 경우 매번 다음을 수행해야 합니다. crontab -l > cron-entry-file
현재 설정을 유지하고 위의 단계를 따르십시오. (누군가가 좀 더 우아한 해결책을 생각해 낼 수 있기를 바라지만, 이러한 무차별적인 접근 방식은 효과가 있을 것입니다.)
편집하다
귀하의 시나리오는 처음 위의 내용을 작성했을 때 생각했던 것만큼 간단하지 않으므로 crontab 파일을 직접 조작하는 것을 고려하십시오. 이는 단지 일반 파일입니다(예: /var/cron/tabs/{username} 아래). 다음 내용을 먼저 읽어 보세요.https://serverfault.com/questions/347318/is-it-bad-to-edit-cron-file-manually
답변2
스크립트 업데이트 cron 항목을 갖는 가장 좋은 방법은 해당 항목을 별도의 파일로 지정하고 cron이 해당 항목에서 정보를 얻도록 하는 것입니다. 질문에 제공한 예를 바탕으로 다음을 수행하게 되었습니다.
echo "0 */2 * * * root /root/$VAR/script > /dev/null 2>&1" > /etc/cron.d/$VAR
그러면 /etc/cron.d/에 변수 이름을 딴 파일이 생성되고 파일 자체에 정의된 일정을 따릅니다. 이 스레드에서 제안한 대로 crontab을 관리하는 것보다 깨끗합니다.