Dev Blog

스크립트 & 소스코드 공유

실무에서 유용하게 쓰는 스크립트와 코드 조각을 블로그 게시판으로 저장하고 공유합니다.

3건의 글

crontab 사용법 - 실행·관리·권한 설정 정리

리눅스 crontab의 사용법을 정리한 글이다. crontab -e로 작업을 편집하고 -l로 내용을 확인하며, 분·시·일·월·요일 형식으로 아파치 재시작 같은 작업을 예약하는 예제를 소개한다. 마지막으로 /etc/cron.allow와 /etc/cron.deny 파일을 이용한 사용자별 crontab 권한 설정 규칙을 설명한다.

반응형

<script async="" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script>(adsbygoogle = window.adsbygoogle || []).push({}); </script>

  1. 실행 및 관리

crontab 파일 에디터

crontab -e

crontab 파일내용 확인

crontab -l

crontab 재시작

/etc/rc.d/init.d/crond restart

crontab 동작 확인

tail /var/log/cron

  1. 설정

30 /usr/local/apache/bin/apachectl restart
: 매시 30분마다 아파치를 재시작 합니다.

30 3 1 10 * /usr/local/apache/bin/apachectl restart
: 10월 1일 3시 30분에 아파치를 재시작 합니다.

45 /3 * 1-5 /usr/local/apache/bin/apachectl restart > dev/console
:월~금요일 매 3시간 45분에 아파치 재시작하고 결과는 콘솔에 출력합니다.

      • 2-4 * /usr/local/apache/bin/apachectl restart
        : 2월~4월까지 매시간 매분에 아파치 재시작을 합니다.
  1. 권한설정

crontab 사용권한 설정을 할 수 있습니다.
: /etc/cron.allow 파일에 허용할 사용자 추가
: /etc/cron.deny 파일에 허용하지 않을 사용자 추가

cron.allow를 먼저 참조합니다. cron.allow에 명시된 사용자는 cron job을 실행할 수 있습니다.
cron.allow에 없는 사용자는 cron.deny에도 없다면 cron job을 실행할 수 있습니다.
cron.allow, cron.deny 두 파일이 존재하지 않으면 슈퍼유저만 cron job을 실행할 수 있습니다. (기본설정)
cron.deny 파일이 존재하고 아무 내용 없이 비어 있다면, 모든 사용자가 cron job을 실행할 수 있습니다.

해시태그로 인스타그램 데이터 불러오기 (PHP 파싱)

PHP의 cURL과 인스타그램 태그 URL을 이용해 해시태그별 게시물 데이터(본문, 썸네일, 좋아요 수 등)를 가져와 JSON 파일로 저장하고, 그누보드 게시판에서 이를 호출해 화면에 출력하는 전체 소스를 정리했다. 크론 작업으로 1시간마다 데이터를 갱신하는 구조와 여러 게시글의 태그를 관리하는 함수를 포함한다.

function _curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$contents = curl_exec($ch);
curl_close($ch);
return $contents;

}
function scrape_insta_hash($tags = array(),$debug = false) {
$insta_array = array();
$output = array();
$output["update_date"] = date("Y-m-d H:i:s");
$index = 0;
foreach($tags as $tag){
$url = 'https://www.instagram.com/explore/tags/'.$tag.'/?__a=1';
$insta_source = _curl($url); // instagrame tag url
$limit = 60; // 가져 올 개수
$results_array = json_decode($insta_source, TRUE);

if($debug == true){
return $results_array;
}
for ($i=0; $i < $limit; $i++) {
$latest_array = $results_array['graphql']['hashtag']['edge_hashtag_to_media']['edges'][$i]['node'];
$text=$latest_array["edge_media_to_caption"]["edges"][0]["node"]["text"];
$shortcode=$latest_array['shortcode'];
$thumbnail_src=$latest_array['thumbnail_src'];
$taken_at_timestamp = $latest_array["taken_at_timestamp"];
$edge_media_preview_like = $latest_array["edge_media_preview_like"];
if($thumbnail_src){
$output[$index]["text"] = $text;
$output[$index]["shortcode"] = $shortcode;
$output[$index]["thumbnail_src"] = $thumbnail_src;
$output[$index]["taken_at_timestamp"] = $taken_at_timestamp;
$output[$index]["edge_media_preview_like"] = $edge_media_preview_like;
$index++;
}
}
}
if($index == 0){
return false;
}
return $output;
}

function get_insta_data($wr_id){
if($wr_id){
$output = array();
$insta_json_data = (array)json_decode(_curl("http://".$_SERVER["HTTP_HOST"].'/data/insta/insta_list.'.$wr_id.'.json'));
unset($insta_json_data["update_date"]);
foreach($insta_json_data as $k => $v){
$output[$v->taken_at_timestamp] = (array)$v;
}
krsort($output,SORT_ASC);
return $output;
}
}

function set_insta_data($tags = array(),$file_name,$mode = ""){
global $g5;
$insta_json_data = json_decode(_curl("http://".$_SERVER["HTTP_HOST"].'/data/insta/'.$file_name));
if($mode == "write"){
$insta_json_data = "";
}
$check_date = date("Y-m-d H:i:s",strtotime($insta_json_data->update_date." +1 hours"));
if($check_date < date("Y-m-d H:i:s") || $insta_json_data == ""){
//update
$output = scrape_insta_hash($tags);
if($output != false){
$outputJson = json_encode($output);
file_put_contents($_SERVER["DOCUMENT_ROOT"].'/data/insta/'.$file_name, $outputJson);
}
}
}
function get_sql_set($arr = array()){
$sql_set = "";
foreach($arr as $k => $v){
$sql_set .= " `".$k."` = '".$v."'";
if($index != count($arr)-1){
$sql_set .= ",";
}
$index++;
}
return $sql_set;
}

if(!function_exists('exe_query'))
{
function exe_query($query,$fetchType = 'default'){
if(function_exists('mysqli_query') && G5_MYSQLI_USE) {
$query = preg_replace('/\/\*.*?\*\/(\r\n|\n|\r)?/s', '', $query);
$query = trim($query);
$result = sql_query($query);
$output = array();
$i = 0;
while($row = $fetchType == 'default' || $fetchType == '' ? @mysqli_fetch_assoc($result) : $fetchType($result)){
foreach($row as $key=>$value){
$output[$i][$key] = $value;
}
$i++;
}
}
return $output;
}
}
function update_insta_data($wr_id){
global $g5;
if($wr_id > 0){
$result = exe_query("select * from ".$g5['write_prefix']."m11 where wr_id = '".$wr_id."'");
$tag_list = array();
foreach($result as $row){
$tags=$row["wr_3"];
if($tags){
$tag_arr = explode("#",$tags);
foreach($tag_arr as $tag){
$tag_list[$row["wr_id"]][] = $tag;
}
}
}
foreach($tag_list as $tag_wr_id => $tag_val){
set_insta_data($tag_val,"insta_list.".$tag_wr_id.".json","write");
}
}
}
function crontab_update_insta_data(){
global $g5;
$result = exe_query("select * from ".$g5['write_prefix']."m11");
$tag_list = array();
foreach($result as $row){
$tags=$row["wr_3"];
if($tags){
$tag_arr = explode("#",$tags);
foreach($tag_arr as $tag){
$tag_list[$row["wr_id"]][] = $tag;
}
}
}
foreach($tag_list as $tag_wr_id => $tag_val){
set_insta_data($tag_val,"insta_list.".$tag_wr_id.".json");
}
}

인스타그램 데이타를 호출하는 부분

<div class="mright">
<img src="/img/t_insta.jpg"> <span style="float: right;"><?=$write[wr_3] ?></span>
<?php $insta_data= get_insta_data($wr_id); ?>
<div class="insta_data" >
<? $index = 1; ?>
<ul>
<? foreach($insta_data as $row){ if($index > 15) break; ?>
<? if($row["thumbnail_src"]){ ?>
<li class="hoverEffect">
<a href="https://www.instagram.com/p/<?=$row["shortcode"] ?>" target="_blank">
<img class="card-img-top" src="<?=$row["thumbnail_src"] ?>" class="">
<p class="txt"><i class="fa fa-heart-o" aria-hidden="true"></i> <?=$row["edge_media_preview_like"]->count ?></p>
</a>
</li>
<? $index++;} ?>
<? } ?>
</ul>
</div>
</div>

주기적으로 PHP 파일 실행하기 (crontab으로 cron.php 돌리기)

리눅스 crontab을 이용해 PHP 파일을 주기적으로 실행하는 방법이다. crontab -e 명령으로 에디터를 연 뒤, 한 시간에 한 번씩 wget으로 http://도메인/cron.php를 호출하는 "0 * * * * wget -O - -q -t 1 URL" 한 줄을 추가하면 정해진 시간마다 PHP 코드가 자동으로 실행된다. cron.php에는 주기적으로 실행할 코드를 넣어두면 된다.

크론탭에 추가

# crontab -e

한시간에 한번씩 원하는 페이지를 실행시키는 코드

0 * * * * wget -O - -q -t 1 [http://domain.com/cron.php](http://domain.com/cron.php)

위와같이 한 줄을 추가하게되면
순서대로 0분 매시간 매일 매월 매요일 이 될 때마다 (다시말해 1시간에 1번) php코드를 실행시키게 된다.
cron.php에는 1시간에 1회 실행될 코드를 넣어두면 된다.



Let's create something great together.

프로젝트 문의 및 견적 요청은 언제든 환영합니다.