Code block

Google Code Prettify + AD Sense

2016年12月14日 星期三

Bash:格式化log內容

統一log訊息前面都加上時間,是不是好用就看個人的習慣
某些程度來說,自己寫的script比較好控制,不然直接用指令 logger 也是挺方便的


#/bin/sh
LOG_FILE=/xxxx/MyLog.log

PipeToMyLog(){
  while IFS= read -r msg; do
  echo -e "`date +%Y/%m/%d\ %H:%N:%S` - $msg" >> $LOG_FILE
done > /dev/stdin
}

FormatMsg(){
  echo -e "`date +%Y/%m/%d\ %H:%N:%S` - $*" >> $LOG_FILE
}

### 以下為使用方式範例
## 使用方式1:透過pipe處理
ls / | PipeToMyLog

## 使用方式2:帶參數方式輸入 - (這種用法比較類似系統內建的logger指令)
FormatMsg "Last status is :$?"

Bash:取得shell script所在目錄

有時候寫了script要給別人用,但是不確定別人會把script放在什麼地方,或是排cron的時候,執行的方式會是什麼,造成log寫錯位置

透過以下方式,取得script所在路徑後,放到 WORK_PATH 這個變數
就比較容易讓log寫在同一個目錄
例如:cmd >> $WORK_PATH/ScriptLog.log

#/bin/bash
FULL_CMD="$0"
DIRNAME_BIN=`which dirname`

## 檢查指令dirname是否存在
if [ -z "${DIRNAME_BIN}" ] || [ ! -x "${DIRNAME_BIN}" ]; then
  echo "Can't use command: dirname"
  exit 1
fi

TMP_WORK_PATH=`${DIRNAME_BIN} ${FULL_CMD}`
echo "${TMP_WORK_PATH}" |grep ^/ > /dev/null
if [ $? -gt 0 ]; then if [ "${TMP_WORK_PATH}" == '.' ]; then
WORK_PATH=$PWD
else
WORK_PATH="$PWD/${TMP_WORK_PATH}"
fi else WORK_PATH=${TMP_WORK_PATH} fi unset TMP_WORK_PATH DIRNAME_BIN

2016年11月1日 星期二

自動啟動被 SharePoint 2013 設定精靈停止的服務

Share Point 2013會因為在本機執行「SharePoint設定精靈」,依照服務的機制,設定精靈會讓部分服務停止,等待設定完畢之後再重新啟動服務,這些會被停止的服務包括:
  • SPSAdminV4
  • SPTimerV4
  • SPSearchController
有時候系統管理者只是不慎點到「SharePoint設定精靈」,因此會按下「取消」按鈕來關閉設定精靈,但是停止的服務便不會再度啟動

為了避免這樣手誤,寫一隻powershell每分鐘來觀察服務被停止的時候,是否「設定精靈」在執行中。
如果設定精靈結束,但服務又沒被帶起來,PowerShell會自動啟動服務

以下為Script內容:

## 欲監控之SPS服務列表
$Service_List= "SPAdminV4","SPTimerV4","SPSearchHostController"
## SPS 設定精靈Process名稱
$SPSCFGWIZ = "psconfigui"

## 指定Mail寄送之SMTP主機
$SMTPServer = "relay.foo.com.tw"
## 指定Mail收件者
$MailTo = "Server Admin<itsa@foo.com.tw>"

##### 檢查程序 #####
## 取得Service狀態
$TargetService = Get-Service |Where-Object Name -in $Service_List
$Process_Check = Get-Process |Where-Object ProcessName -like ${SPSCFGWIZ}*

## 符合條件之後續處理
ForEach ($SVC in $TargetService) {
 IF ($SVC.Status -eq "Stopped" -and -Not $Process_Check) {
  $Begin_Time = Get-Date
  Start-Service $SVC.Name
  $End_Time = Get-Date
  
  $MailFrom = "Watch Dog <" + $env:USERNAME + "@" + ([system.net.dns]::GetHostByName('').HostName) + ">"
  $MailSubject = "檢測通知:" + $SVC.DisplayName + "服務已重新啟動"
  $MailBody = "Hi," + " `r`n`t" + "主機:" + $env:computername +  " 的 " + $SVC.DisplayName + " 服務於 "  + $Begin_Time.ToString("yyyy/MM/dd HH:MM:ss") + " 重新啟動,耗時:" + ($End_Time - $Begin_Time).TotalSeconds + "秒" + "`r`n" + "`t" + "原因:服務狀態為Stopped." + " `r`n`r`n" + "`t" + "Your Watch Dog"
  ## 寄送郵件
  Send-MailMessage -to $MailTo  -From $MailFrom -Subject $MailSubject -Body $MailBody -SmtpServer $SMTPServer -Encoding UTF8 -Priority High
  }
}

2016年10月18日 星期二

刪除資料表內完全相同的資料的其中一筆

使用CTE,並且用ROW_NUMBER,建立一個ROWID,再以ROWID刪除
※ 刪除前,先用SELECT確認一下


WITH Del_Temp AS (
SELECT *,ROW_NUMBER() OVER (ORDER BY COL_A) AS ROWID
FROM [dbo].[TABLE] where COL_A = 'RECORD_ID'
)

SELECT * FROM Del_Temp WHERE ROWID = 1
--DELETE Del_Temp WHERE ROWID = 2

網誌重新開張

以往web、mail都是習慣自己架設主機,雖說掌握度高,但是久了之後漸漸發現,資訊基礎建設的維護也越來越複雜。

例如:電費、頻寬費用、備援、SPAM....等,漸漸地再也越來越不堅持一定要自己「手做」,依附外面的服務也挺不錯的,而且一些細節的地方比自己架設的環境還好。

所以時代在改變,習慣也要跟著改變,因此網誌又再度開張了~ 只可惜以前的文章都不在了,新的時代、新的開始

2016年10月6日 星期四

「開啟檔案 - 安全性警告」移除

最近抓了Eclipse學習寫程式,雖說eclipse不錯用,但是都有個困擾,那就是每次開啟eclipse的時候,都會跳出一個「開啟檔案 - 安全性警告」,按下確定之後才能開啟eclipse

網路上看到最多的解法就是:
  1. 透過gpedit.msc,將.exe加入中度風險檔案類型清單
  2. 在IE「網際網路選項」的「安全性」頁籤,將網路路徑加入「近端網路」
但是方法1有安全性風險,所以不妥,而方法2又不適用在本機電腦執行的eclipse.exe


後來發現,原來下載的eclipse.exe,在NTFS上有個屬性標籤,讓作業系統辨識這個檔案是從網路下載,因此每次持行這個檔案時,都會跳出安全性警告

這個屬性,透過dir /r就可以檢視到,由下圖能看到,eclipse.exe1是被我更名過的檔案,它有個Zone.Identifier:$DATA的屬性


所以,只要移除標籤就可以了,而移除方式還挺簡單的,先將檔案壓縮起來,再將原始檔案更名(或移除),再解壓縮就好了
※所以能看到上圖中的eclipse.exe沒有Zone.Identifier:$DATA屬性的