C# Kill Process

C#에서 Kill Process사용시 Child프로세스로 변경된 Process는 PID가 달라 Kill이 안되는 오류가 발생한다.

아래와 같이 WMI를 이용하여 프로세스를 가져오면 정확한 PID를 읽어서 처리할 수 있다.

private static void KillProcessWMI(string szProcessName)
{
SelectQuery query = new SelectQuery(“Win32_Process”);
query.Condition = “Name='” + szProcessName + “‘”;
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
int pid = Convert.ToInt32(mo[“ProcessID”]);
try
{
Process proc = Process.GetProcessById(pid);
proc.Kill();
}
catch(Exception)
{
}
}
}

Ubuntu 14.04 에 PHP 5.3 설치

ubuntu 12.04 서버를 잘 사용하고 있었다가 이번에 14.04로 업데이트 하였다.

잘 쓰던 링크하드가 문제가 발생 하여 PHP5.3 버전을 vhost에 적용해보기로 하였다.

우선 빌드를 위한 환경이 구축되어 있어야 한다.  빌드 환경이 축되어 있다면, 아래의 순서로 진행한다.

1. PHP 5.3빌드를 위해 관련 라이브러리를 설정한다.

sudo apt-get install libxml2-dev libpcre3-dev libbz2-dev libcurl4-openssl-dev libjpeg-dev libpng12-dev libxpm-dev libfreetype6-dev libmysqlclient-dev postgresql-server-dev-9.1 libt1-dev libgd2-xpm-dev libgmp-dev libsasl2-dev libmhash-dev unixodbc-dev freetds-dev libpspell-dev libsnmp-dev libtidy-dev libxslt1-dev libmcrypt-dev

2. 소스를 다운 받고 설정한다.

wget http://in1.php.net/distributions/php-5.3.28.tar.bz2
tar -xvf php-5.3.28.tar.bz2
cd php-5.3.28

일반적인 ./configure 는 대략 다음과 같다.

sudo ./configure \
–prefix=/usr/share/php53 \
–datadir=/usr/share/php53 \
–mandir=/usr/share/man \
–bindir=/usr/bin/php53 \
–with-libdir=lib64 \
–includedir=/usr/include \
–sysconfdir=/etc/php53/apache2 \
–with-config-file-path=/etc/php53/cli \
–with-config-file-scan-dir=/etc/php53/conf.d \
–localstatedir=/var \
–disable-debug \
–with-regex=php \
–disable-rpath \
–disable-static \
–disable-posix \
–with-pic \
–with-layout=GNU \
–with-pear=/usr/share/php \
–enable-calendar \
–enable-sysvsem \
–enable-sysvshm \
–enable-sysvmsg \
–enable-bcmath \
–with-bz2 \
–enable-ctype \
–without-gdbm \
–with-iconv \
–enable-exif \
–enable-ftp \
–enable-cli \
–with-gettext \
–enable-mbstring \
–with-pcre-regex=/usr \
–enable-shmop \
–enable-sockets \
–enable-wddx \
–with-libxml-dir=/usr \
–with-zlib \
–with-kerberos=/usr \
–with-openssl=/usr \
–enable-soap \
–enable-zip \
–with-mhash \
–with-exec-dir=/usr/lib/php5/libexec \
–without-mm \
–with-curl=shared,/usr \
–with-zlib-dir=/usr \
–with-gd=shared,/usr \
–enable-gd-native-ttf \
–with-jpeg-dir=shared,/usr \
–with-png-dir=shared,/usr \
–with-ttf=shared,/usr \
–with-t1lib=shared,/usr \
–with-ldap=shared,/usr \
–with-mysql=shared,/usr \
–with-mysqli=shared,/usr/bin/mysql_config \
–with-pspell=shared,/usr \
–with-unixODBC=shared,/usr \
–with-xsl=shared,/usr \
–with-snmp=shared,/usr \
–with-sqlite=shared,/usr \
–with-tidy=shared,/usr \
–with-xmlrpc=shared \
–enable-pdo=shared \
–without-pdo-dblib \
–with-pdo-mysql=shared,/usr \
–with-pdo-pgsql=shared,/usr \
–with-pdo-odbc=shared,unixODBC,/usr \
–with-pdo-dblib=shared,/usr \
–enable-force-cgi-redirect  –enable-fastcgi \
–with-libdir=/lib/i386-linux-gnu \
–with-pdo-sqlite=shared \
–with-sqlite=shared \
–enable-ipv6 \
–with-mcrypt \
–with-imap-ssl

–with-libdir=/lib/i386-linux-gnu 와 같은 옵션의 디렉토리는 자신의 서버와 맞게 바꾼다.
오류가 나는 사항이 있다면 옵션을 알맞게 조정해 준다.

추가 오류사항은 원문에 오류 메세지를 참고 해본다.

3. 빌드를 수행한다.
sudo make
sudo make install

오류가 없이 빌드가 되었다면 php 5.3 버전은 설치가 되었다.

이제 빌드된 extension 파일들을 extensions 디렉토리에 넣어준다.

일반적이라면 /usr/local/lib/php/extensions/no-debug-non-zts-20090626, phpinfo를 이용하여 정확히 확인해 본다.

sudo cp modules/*.so /usr/local/lib/php/extensions/no-debug-non-zts-20090626

4. Apache를 위한 Conf파일을 설정한다.

sudo mkdir /etc/php53
sudo mkdir /etc/php53/apache2
sudo ln -s /etc/php5/conf.d /etc/php53
sudo ln -s /etc/php5/cli /etc/php53
sudo cp php.ini-development /etc/php53/apache2/php.ini

5. fast CGI를 이용하여 PHP 5.3을 vhost와 연결한다.

Apache에 Fast CGI 를 설치한다.

sudo apt-get install libapache2-mod-fastcgi
sudo a2enmod cgi fastcgi actions
sudo service apache2 restart

/usr/lib/cgi-bin 디렉토리에 php53-cgi 파일을 아래의 내용으로 생성한다.

#!/bin/sh PHPRC="/etc/php53/apache2/"
 export PHPRC PHP_FCGI_CHILDREN=4
 export PHP_FCGI_CHILDREN
 PHP_FCGI_MAX_REQUESTS=5000
 export PHP_FCGI_MAX_REQUESTS
 exec /usr/bin/php53/php-cgi

실행 파일의 권한을 준다.

sudo chmod +x /usr/lib/cgi-bin/php53-cgi

Include에 사용될 /etc/apache2/php53.conf 파일을 작성한다.

Include file for virtual hosts that need to run PHP 5.3
 <FilesMatch "\.php">
 SetHandler application/x-httpd-php5
 </FilesMatch>
 ScriptAlias /php52-cgi /usr/lib/cgi-bin/php53-cgi
 Action application/x-httpd-php5 /php53-cgi
 AddHandler application/x-httpd-php5 .php

PHP 5.3버전을 사용할 vhost의 conf파일에 아래의 include를 추가한다. (중요)

Include php53.conf

Apache를 재시작 해준면 완료된다.

sudo service apache2 reload

참고 원문 : http://zgadzaj.com/how-to-install-php-53-and-52-together-on-ubuntu-1204

우분투9.04 server 랜카드 설정

1. dmesg 네트워크 카드의 eth 번호와 /etc/udev/rules.d/70-persistent-net.rules 에 네트워크 카드 eth를 맞춰준다.
2. /etc/network/interfaces 에 해당 eth 에 대해 설정해준다.


드라이버 빌드환경 구축
sudo apt-get install build-essentials
sudo apt-get install linux-sources-2.*
sudo apt-get install linux-headers-2.*


[해결방법] 디스크 공간을 확보하기위해 Outlook Express에서 메시지를 압축할 수 있습니다.

 이오류에 대해 레지스트리 키를 수정하는 여러 문서가 있어 참고해봤더니 잘 안된다.
 HKEY_CURRENT_USER->Identities->{ GUID } ->Software->Microsoft->Outlook Express->5.0의 Compact Check Count의 값을 수정해봐야 계속 count가 올라가서 100이면 다시 메세지가 뜨게된다.

 이런저런 방법을 찾던중 windows search와 관련이 있다는 내용을 마소닷컴에서 찾았다. ( 하지만 내컴퓨터에는 윈도우 search가 안깔려있는걸..) NMIndexingService와도 관련이 있다는내용이 Nero포럼에 있었다..

 발견한 해결 방법은 다음과 같다.
1. 윈도우즈 업데이트 중 Microsoft Desktop search 4.0 삭제
2. Nero 7.0 을 사용중이면 Nero Scout 중지
    보통 C:\Program Files\Common Files\Ahead\Lib 에 NeroScoutOption.exe를 실행후 Enable Nero Scout 을 해제 한다. ( e-mail부분이 비활성화 되어있는지 확인)
3. 제어판 -> 관리도구 -> 서비스 에서 NMIndexingService를 중지후 사용안함으로 선택한다.

레시스트리를 확인해보니 count가 증가 안하고 이상없이 잘 된다.

ClarkConnect 4.3 CE 설치

ClarkConnect 4.3 CE버전을 두번째 서버에 설치하였다. 4.2버전에서 문제되었던 8169드라이버 문제는 업데이트 되면서 해결된 모양이다.
rt8169 와 nvidia mcp67 내장 랜을 자동으로 인식한다.
PHP와 MySQL 은 4.3 과 4.1 버전이므로 cc4.2에서처럼 업데이트를 수행한다.


1. ClarkConnect에 Kernel 소스 및 개발 도구 설치
# apt-get update
# apt-get install cc-devel kernel-sourcecode kernel-devel


2. 소스 트리를 업데이트한다.
# echo “rpm [pcn] ftp://rhel-4:hiptop@rh.apt.clarkconnect.com System extras” > /etc/apt/sources.list.d/extras.list
# apt-get update


3. MySQL과 PHP가 인스톨되어 있으면
# apt-get dist-upgrade


4. php 모듈을 설치 ( 나머지는 자동으로 설치됨)
# apt-get update
# apt-get install php-gd php-soap php-xml


5. Webmin 설치  webmin 다운로드
# rpm -U webmin-1.430-1.noarch.rpm


6. grub.conf 수정
초기 로딩시 화면 깨짐 문제와 Graphic Console의 에러를 수정하기 위하여 Grub.conf의 다음과 같은 내용을 수정한다.
———————————————————————–
kernel /vmlinuz-2.6.18-8.1.14.3.cc ro root=/dev/md2 video=vesafb vga=0x314
———————————————————————–
———————————————————————–
kernel /vmlinuz-2.6.18-8.1.14.3.cc ro root=/dev/md2 video=vga16fb vga=0x314
———————————————————————–


7. svn 설치
  기본 설치되는 subversion은 svn 1.1.4-2 버전이므로 1.4.4 버전으로 업데이트
# apt-get install neon
# apt-get install subversion

  svn 1.4.4에 맞는 apr과 apr-util rpm을 다운받는다. (neon은 변경없음)
#rpm -U apr-0.9.12-2.i386.rpm
#rpm -U apr-util-0.9.12-1.i386.rpm
#rpm -U subversion-1.4.4-1.i386.rpm

  서비스에 추가
# echo “svnserve -d -r /home/svn/dev1” > /etc/init.d/svn
# chmod 755 /etc/init.d/svn

8. 사용자에게 ssh 권한주기
  4.x버전 부터는 사용자는 보안상 기본적으로 ssh를 적용할 수 없다. 보안을 무시하고 ssh권한을 주겠다면 다음과 같이 수행한다.
  webconfig에서 사용자를 추가한다
# passwd <username>
# usermod -s /bin/bash <username>

9. RocketRaid 1740의 Open Source 드라이버는 4.2 와 설치 방법이 동일

ClarkConnect4.2 CE Cyrus IMAP 관련

ClarkConnect 4.2 CE 의 Cyrus IMAP 2.2.12 기준
Cyrus-IMAP의 메일 박스에 이상이 생겨서 POP를 로그인을 할 수 없었다. ClarkConnect Forum에서 다음과 같은 내용을 찾았다.

기존의 Mail Box를 텍스트파일로 덤프:


su – cyrus -c “/usr/lib/cyrus-imapd/ctl_mboxlist -d”  > /var/lib/imap/mailboxlist.txt


텍스트파일에서  Mail Box 생성:


su – cyrus -c “/usr/lib/cyrus-imapd/ctl_mboxlist -u” > /var/lib/imap/mailboxlist.txt


MailBox를 다시 생성:


su – cyrus -c “/usr/lib/cyrus-imapd/reconstruct -r -f user”

메일 박스에러로 인해 IMAP또는 POP3를 로그인할 수 없을때에는 MailBox를 다시 생성해주면 된다.

원문보기 : http://www.clarkconnect.com/forums/showflat.php?Cat=0&Number=89008&Main=88543

Java UDP를 이용한 Magic Packet Sender

개인적으로 쓰려고 Java UDP를 이용하여 Magic Packet을 전송하는 프로그램을 만들어봤다.

실행 화면

Java Magic Packet Sender
Java Magic Packet Sender







관련 소스



import java.io.*;
import java.net.*;
import java.util.*;

public class Main extends javax.swing.JFrame
{

 public Main()
 {
  initComponents();
 }

 private void initComponents()
 {
  this.setTitle(“Java Magic Packet Sender”);
  bTrans = new javax.swing.JButton();
  bClose = new javax.swing.JButton();
  mac_address = new javax.swing.JTextField();
  mac_address.setText(“”);
  mac_address.setColumns(20);
  bClose.setText(“닫기”);
  bClose.addActionListener(new java.awt.event.ActionListener()
  {
   public void actionPerformed(java.awt.event.ActionEvent evt)
   {
    ExitActionPerformed(evt);
   }
  });
  bTrans.setText(“전송”);
  bTrans.addActionListener(new java.awt.event.ActionListener()
  {
   public void actionPerformed(java.awt.event.ActionEvent evt)
   {
    TransActionPerformed(evt);
   }
  });
  getContentPane().add(“East”, bTrans);
  getContentPane().add(“South”, bClose);
  getContentPane().add(“Center”, mac_address);
  setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  pack();
 }

 private boolean parseMacAddress(String text)
 {
  boolean result = true;
  if (text.equals(“”))
   return false;
  try
  {
   int minus = text.indexOf(“-“);
   int colon = text.indexOf(“:”);
   if (minus >= 0)
   {
    StringTokenizer token = new StringTokenizer(text, “-“, false);
    int count = token.countTokens();
    mac = new byte[count];
    for (int i = 0; i < count; i++)
    {
     String to = token.nextToken();
     byte temp = (byte)(Integer.parseInt(to, 16));
     mac[i] = temp;
    }
   }
   else if (colon >= 0)
   {
    StringTokenizer token = new StringTokenizer(text, “:”, false);
    int count = token.countTokens();
    mac = new byte[count];
    for (int i = 0; i < count; i++)
    {
     String to = token.nextToken();
     byte temp = (byte)(Integer.parseInt(to, 16));
     mac[i] = temp;
    }
   }
   else
   {
    result = false;
   }

  }
  catch (Exception e)
  {
   result = false;
  }
  return result;
 }

 private void TransActionPerformed(java.awt.event.ActionEvent evt)
 {

  if (mac_address.getText() != null && !mac_address.getText().equals(“”))
  {
   if (parseMacAddress(mac_address.getText()))
   {
    try
    {
     int total_length = header.length + (mac.length * 16);
     message = new byte[total_length];
     for (int i = 0; i < header.length; i++)
     {
      message[i] = header[i];
     }
     int count = header.length;
     for (int j = 0; j < 16; j++)
     {
      for (int i = 0; i < mac.length; i++)
      {
       message[count++] = mac[i];
      }
     }
     InetAddress group = InetAddress.getByName(“255.255.255.255”);
     DatagramSocket ds = new DatagramSocket(6);
     DatagramPacket dsheaer = new DatagramPacket(message, message.length, new InetSocketAddress(“255.255.255.255”, 6));
     ds.send(dsheaer);
     ds.close();
    }
    catch (Exception e)
    {
     e.printStackTrace();
    }
   }
  }
 }

 private void ExitActionPerformed(java.awt.event.ActionEvent evt)
 {
  this.dispose();
 }

 public static void main(String args[])
 {

  if (args != null && args.length > 1)
  {

  }
  java.awt.EventQueue.invokeLater(new Runnable()
  {
   public void run()
   {
    new Main().setVisible(true);
   }
  });
 }

 private byte[] header = { (byte)255, (byte)255, (byte)255, (byte)255, (byte)255, (byte)255 };
 private byte[] mac;
 private byte[] message;
 private javax.swing.JButton bTrans;
 private javax.swing.JButton bClose;
 private javax.swing.JTextField mac_address;

}

RocketRaid 1740 RAID HDD 교체


1. /etc/fstab 에 연결된 Array의 Mount를 삭제 후 리부팅한다.
2. HtpSrv에 접속하여 Manage -> Array -> Mainterence -> Delete 선택하여 Array를 삭제한다.
3. Array가 삭제되면 unplug를 이용하여 모든 HDD를 정지시킨다.
4. 모든 HDD를 교체한다.
5. Manage -> Device -> Initialize Device를 이용하여 모든 HDD를 초기화 한다.
6. Manage -> Array -> Create Array를 이용하여 Array를 생성한다.
    ( RAID 0, 1, 5, 10 중 선택)
7. Manage -> Array -> Initailize Array 를 이용하여 Array를 초기화 한다.
8. fdisk 수행후 Array를 Format
   ext3 : mke2fs -j /dev/sda1
   ext2 : mkfs -t ext2 /dev/sda1
9. Array를 Mount
   마운트 폴더를 생성 : mkdir  /disk
   ext3 : mount -t ext3 /dev/sda1 /disk
   ext2 : mount -t ext2 /dev/sda1 /disk
10. fatab에 추가
   vi /etc/fstab
   /dev/sda1 /disk ext3 defaults 1 2