리눅스 서버는 /etc/machine-id 라는 파일이 있다. 해당 파일은 machine의 고유 아이디값을 랜덤하게 생성하여 저장된 것으로 32글자로 된 16바이트/128비트 의 UUID값이다.

 machine-id는 dbus 또는 systemd 동작에 관련되어 있으며 /etc/machine-id 는 기본적으로 /var/lib/dbus/machine-id 에 심볼릭 링크되어있는 경우도 있다.

일단 해당 파일이 없는경우 어떤 문제가 일어나는지 알아보자

[    2.680252] systemd[1]: Inserted module 'ip_tables'
[    3.751916] systemd-journald[665]: Failed to get machine id: No such file or directory
[    3.755044] systemd-journald[677]: Failed to get machine id: No such file or directory
[    3.757980] systemd-journald[678]: Failed to get machine id: No such file or directory
[    3.760862] systemd-journald[679]: Failed to get machine id: No such file or directory
[    3.763454] systemd-journald[680]: Failed to get machine id: No such file or directory
[    4.023763] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:26] Failed to replace specifiers: /run/log/journal/%m
[    4.023804] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:28] Failed to replace specifiers: /run/log/journal/%m
[    4.023838] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:29] Failed to replace specifiers: /run/log/journal/%m
[    4.023873] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:32] Failed to replace specifiers: /var/log/journal/%m
[    4.023910] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:33] Failed to replace specifiers: /var/log/journal/%m/system.journal
[    4.031224] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:37] Failed to replace specifiers: /var/log/journal/%m
[    4.031259] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:38] Failed to replace specifiers: /var/log/journal/%m
[    4.031292] systemd-tmpfiles[676]: [/usr/lib/tmpfiles.d/systemd.conf:39] Failed to replace specifiers: /var/log/journal/%m/system.journal

시스템의 dmesg내용을 보면 위와같은 항목이 나타나게 된다. 이것은 systemd가 부팅시 machine-id 를 읽어 관련 동작을 초기화하는데 있어 machine-id값이 없어서 나는 오류메시지 이다.
파일이 없으면 자동으로 생성하면 되는게 아닌가 싶은데 일단 파일이 없는경우 자동생성되지 않고 위와같이 오류메세지가 나타난다.

또한 이 오류로 인해 systemd 관련 로그가 생성되지 않는다. 즉 대부분의 /var/log/에 쌓이는 로그들이 정상적으로 기록되지 않는다.

해결법

위 증세를 해결하기 위해서는 반드시 /etc/machine-id라는 파일이 존재하여야 한다.
두가지 방법이 있는데 아래를 참조하면 된다.

  • systemd-machine-id-setup 이용하는 방법
rm -f /etc/machine-id /var/lib/dbus/machine-id
systemd-machine-id-setup
  • dbus-uuidgen 사용법
rm -f /etc/machine-id /var/lib/dbus/machine-id
dbus-uuidgen --ensure=/etc/machine-id
dbus-uuidgen --ensure

시스템 재부팅 할 것~!

출처 : https://atl.kr/dokuwiki/doku.php/machine-id

  • 리눅스 history 날짜/시간 적용 방법

history에 날짜/시간을 적용하는 방법 자체도 매우 쉽고, 사용 하다보면 history에 날짜/시간이 적용되지 않아 history를 추적하기 힘든 상황이 발생할 수 있기 때문에 되도록 history에는 날짜와 시간을 적용하여 사용하는것이 좋습니다.

아래와 같이 /etc/profile 파일을 vi 편집기로 열은 후 맨 마지막 줄에 HISTTIMEFORMAT="[%Y-%m-%d_%H:%M:%S]  " 를 넣어주면 끝 입니다.

vi /etc/profile

# 맨 마지막 줄로 이동하여 아래 내용 기입
HISTTIMEFORMAT="[%Y-%m-%d_%H:%M:%S]  "
:wq

또는 아래와 같이 한줄로 간단하게 적용할 수 있습니다.

echo "HISTTIMEFORMAT=\"[%Y-%m-%d_%H:%M:%S]  \"" >> /etc/profile

적용 후 원격터미널을 로그아웃 후 재접속한 뒤 history 명령을 실행하면 입력했던 명령어 앞에 날짜와 시간이 나오는 것을
확인할 수 있다.

출처 : https://nirsa.tistory.com/234

리눅스 sendmail "unable to qualify my own domain name (YOUTHOSTNAME) unknown; sleeping for retry" 발생 시

보통 서버의 호스트네임을 localhost 말고 다른걸로 변경하여 사용할 때 발생 하는데, 서비스 시작이 굉장히 느리게 되거나 안되는 경우가 안되기도 합니다.

"unable to qualify my own domain name (YOUTHOSTNAME) unknown; sleeping for retry" 에러가 발생하면 hosts 파일에 127.0.0.1으로 서버의 호스트 네임을 작성 해주시면 됩니다.

hostname이 antamis 일 경우

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  antamis
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

 

출처 : https://nirsa.tistory.com/315

PHP 에서 날짜를 다루는데는 주로 date(), strtotime(), mktime() 의 세가지 함수를 사용 합니다. 각각의 사용법과 몇가지 응용에 대해서 알아보도록 하겠습니다.

1. date() 함수.

string date ( string $format [, int $timestamp ] )

정수형으로 주어지는 timestamp나, timestamp가 주어지지 않았을 경우에는 현재 로컬 시간을 사용하여, 주어진 포맷 문자열에 따라 형식화한 문자열을 반환합니다. 즉 timestamp는 선택적이고, 기본값은 time()의 값입니다. 지원되지 않는 포맷 문자는 그대로 출력됩니다.

<?php
$dateString = date("Y-m-d", time());
echo $dateString;
?>

결과)
2017-01-10

2. strtotime() 함수.

int strtotime ( string $time [, int $now = time() ] )

주어진 날짜 형식의 문자열을 1970년 1월 1일 0시 부서 시작하는 유닉스 타임스탬프로 변환합니다. 두번째 인자가 주어지면 주어진 타임스탬프를 기준으로 계산되어 집니다. 날짜가 주어지지 않고 변화량만 주어지면 로컬 타임이 사용됩니다.  +1 day, +1 week 등이 사용될 수 있고, 음수값도 사용됩니다.

<?php
$timestamp = strtotime("+1 week");
echo date("Y-m-d", $timestamp), "<br/>";

$timestamp = strtotime("2016-12-01 +1 week");
echo date("Y-m-d", $timestamp), "<br/>";
?>

결과)
2017-01-17
2016-12-08

3. mktime() 함수.

int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )

인자로 주어진 값(시,분,초,월,일,년)에 대응하는 타임스탬프를 반환합니다.

<?php
$timestamp = mktime(0, 0, 0, 1, 1, 2017);
echo date('Y-m-d', $timestamp);
?>

결과)
2017-01-01

4. 사용 예제 입니다.

- 특정월의 마지막 날짜를 구하는 방법입니다.

방법은 date함수의 포맷문자열 't'를 사용합니다. 't'는 주어진 월의 일수를 구하는 형식 문자 입니다.

$lastDay = date('t', strtotime("2017-01-01"));

타임스탬프는 mktime 으로 구할수도 있습니다.

$lastDay = date('t', mktime(0, 0, 0, 1, 1, 2017));

mktime함수의 인자는 순서대로 시간, 분, 초, 월, 일, 년도 입니다.

- 특정 날짜의 요일을 구하는 방법 입니다.

$day = "2017-01-10";

date 함수의 'w' 포맷 문자는 0부터 6까지의 숫자값을 반환합니다. 순서대로 일~토 를 나타냅니다.

$weekString = array("일", "월", "화", "수", "목", "금", "토");
echo($weekString[date('w', strtotime($day))]);

- 하루전 날짜를 구하는 방법 입니다.

$day = "2017-01-10"; 의 하루전 날짜인 "2017-01-09" 를 문자열로 구하려고 합니다.

$beforeDay = date("Y-m-d", strtotime($day." -1 day"));

날짜 뒤에 "+1 day", "+1 month", "+1 year", "+1 week" 등의 문자열을 붙여서 날짜를 계산할 수 있습니다.

5. date 함수에서 사용할 수있는  포맷문자열 입니다.

--- 일 ---
d  :  일, 앞에 0이 붙는 2 숫자  [ 01에서 31 ]
D  :  요일 글자 표현, 3 문자 [ Mon에서 Sun ]
j  :  앞에 0이 붙지 않는 일 [ 1에서 31 ]
l  :  (소문자 'L') 요일의 완전한 글자 표현 [ Sunday에서 Saturday ]
N  :  요일의 ISO-8601 숫자 표현 (PHP 5.1.0에서 추가) [ 1(월요일)에서 7(일요일) ]
S  :  일 영어 접미사, 2 문자 [ st, nd, rd, th. j와 같이 사용하기 좋음. ]
w  :  요일 숫자 표현 [ 0(일요일)에서 6(토요일) ]
z  :  해당 연도 일차 [ (0에서 시작) 0에서 365 ]

--- 주 ---
W  :  ISO-8601 주차, 주는 월요일에 시작 (PHP 4.1.0에서 추가) [ 예시: 42 (그 해의 42번째 주) ]

---월 ---
F  :  January나 March 같은 월의 완전한 글자 표현 [ January에서 December ]
m  :  0이 붙는 월 숫자 표현 [ 01에서 12 ]
M  :  월의 축약 글자 표현, 3 문자 [ Jan에서 Dec ]
n  :  0이 붙지 않는 월 숫자 표현 [ 1에서 12 ]
t  :  주어진 월의 일 수 [ 28에서 31 ]

--- 연 ---
L  :  윤년 여부 [ 윤년엔 1, 그 외엔 0 ]
o  :  ISO-8601 연도. Y와 같지만, ISO 주차(W)가 전해나 다음해에 해당하면, 그 연도를 사용합니다. (PHP 5.1.0에서 추가) [ 예시: 1999나 2003 ]
Y  :  연도의 완전한 숫자 표현, 4 숫자 [ 예시: 1999나 2003 ]
y  :  도의 두 숫자 표현 [ 예시: 99나 03 ]

--- 시간 ---
a  :  오전과 오후의 소문자 [ am 또는 pm ]
A  :  오전과 오후의 대문자 [ AM 또는 PM ]
B  :  스와치 인터넷 시간 [ 000에서 999 ]
g  :  0이 붙지 않는 12시간 형식 시 [ 1에서 12 ]
G  :  0이 붙지 않는 24시간 형식 시 [ 0에서 23 ]
h  :  0이 붙는 12시간 형식 시 [ 01에서 12 ]
H  :  0이 붙는 24시간 형식 시 [ 00에서 23 ]
i  :  0이 붙는 분 [ 00에서 59 ]
s  :  초, 0이 붙음 [ 00에서 59 ]
u  :  마이크로초 (PHP 5.2.2에서 추가) [ 예시: 54321 ]

--- 시간대 ---
e  :  시간대 식별자 (PHP 5.1.0에서 추가) [ 예시: UTC, GMT, Atlantic/Azores ]
I  :  (대문자 i) 일광 절약 시간 여부  [ 일광 절약 시간이면 1, 아니면 0 ]
O  :  그리니치 시간(GMT)과 시차 [ 예시: +0200 ]
P  :  시와 분 사이에 콜론이 들어가는 그리니치 시간(GMT)과 차이 [ 예시: +02:00 ]
T  :  시간대 축약어 [ 예시: EST, MDT ... ]
Z  :  시간대 오프셋 초. UTC 서쪽은 항상 음수, UTC 동쪽은 항상 양수 [ -43200에서 50400 ]

--- 날짜/시간 표현 ---
c  :  ISO 8601 날짜 (PHP 5에서 추가) [ 2004-02-12T15:19:21+00:00 ]
r  :  ≫ RFC 2822 형식 날짜 [ 예시: Thu, 21 Dec 2000 16:01:07 +0200 ]
U  :  유닉스 에포치(January 1 1970 00:00:00 GMT)부터 초수 [ time() 참조 ]

 

출처: https://offbyone.tistory.com/38 [쉬고 싶은 개발자:티스토리]

게시판에 글을 작성할 때 본문 내용이 정상적으로 다 올라가지 않고 뒷부분이 잘리는 경우가 있습니다.

- 웹페이지에서 글을 복사해서 그대로 붙여 넣을 경우

- 한글이나 워드 프로그램에서 작성한 문서 내용을 복사해서 그대로 붙여 넣을 경우

특히 위와 같은 경우 글을 붙여 넣고 에디터 하단 탭에서 HTML 소스 보기를 해보면 다량의 태그 코드가 추가돼있는 걸 확인할 수가 있는데 그래서 데이터 저장 허용 크기를 넘어선 부분들은 전부 누락되는 것이죠.

 

1. 게시판 필드 타입 변경

그누보드는 게시판 내용 값이 저장되는 wr_content 필드 타입이 TEXT로 되어 있습니다.

해당 필드 타입을 TEXT에서 MEDIUMTEXT 또는 LONGTEXT로 변경합니다.

phpMyAdmin 을 이용하면 쉽게 변경할 수 있습니다.

웹호스팅을 이용 중이라면 내 호스팅 관리 메뉴 등에 phpMyAdmin 접속 링크가 대부분 있을 겁니다.

좌측 DB 테이블에서 원하는 게시판 선택 후 wr_content 필드 수정 버튼 클릭

g5_write_1111 이런 형태로 되어 있는 게 게시판 테이블이고 끝부분 1111 이 게시판 id 입니다.

수정 화면에서 필드 종류를 TEXT 에서 MEDIUMTEXT 또는 LONGTEXT 로 변경

phpMyAdmin 을 사용하기 곤란한 상황이거나 위와 같이 적용했는데 에러가 뜬다면 이렇게 하세요.

해당 게시판에서 사용하고 있는 게시판 스킨 write.skin.php 파일 상단 

if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가

위 코드 바로 밑에 다음 코드를 추가합니다.

MEDIUMTEXT 로 변경하려면 이렇게..

sql_query(" ALTER TABLE `{$write_table}` CHANGE `wr_content` `wr_content` MEDIUMTEXT NOT NULL ");

LONGTEXT 로 변경하려면 이렇게..

sql_query(" ALTER TABLE `{$write_table}` CHANGE `wr_content` `wr_content` LONGTEXT NOT NULL ");

MEDIUMTEXT 또는 LONGTEXT 둘 중 하나만 선택해서 적용하세요.

write.skin.php 파일에 위 코드를 추가하고 게시판 클릭 후 글쓰기 화면을 한 번 띄워주면 자동으로 변환됩니다.

다른 게시판도 바꾸고 싶으면 변환하고자 하는 게시판을 클릭 후 마찬가지로 글쓰기 화면을 띄워주면 됩니다.

해당 게시판에서 사용되고 있는 스킨 파일에 적용한 게 맞는지 정확히 확인하세요.

요즘은 반응형 테마까지 나와서 다른 스킨 파일에 잘못 적용하는 분들이 의외로 많이 계십니다.

적용 후 해결이 되면 추가했던 위 코드는 반드시 다시 삭제하세요.

2. bbs/write_update.php 파일 수정

if (isset($_POST['wr_content'])) {
    $wr_content = substr(trim($_POST['wr_content']),0,65536);
    $wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
}


 여기서 이 부분 숫자를 아래 참고사항에 있는 최대 저장 크기 값 참고해서 적당히 늘려주거나

$wr_content = substr(trim($_POST['wr_content']),0,16777216);

 아니면 이렇게 없애버립니다.

$wr_content = trim($_POST['wr_content']);

 

* 참고사항 (데이터 타입별 최대 저장 크기)

TEXT : 65535
MEDIUMTEXT : 16777215
LONGTEXT : 4294967295

3. lib/editor.lib.php 파일 수정

아래 함수를 찾은 후 maxlength=\"65536\" 이 부분 최대 저장 크기를 2번 내용처럼 적당히 변경하거나 삭제

function editor_html($id, $content)
{
    return "<textarea id=\"$id\" name=\"$id\" style=\"width:100%;\" maxlength=\"65536\">$content</textarea>";

}

 

출처 : https://gnustudy.com/bbs/board.php?bo_table=gnu_tip&wr_id=24