Skip to main content

ไม่สามารถสร้างไฟล์ หรือโฟลเดอร์ที่มี Permission 777 ได้ใน Linux

หลายคนอาจเคยประสบปัญหาเกี่ยวกับการสร้างไฟล์ หรือโฟลเดอร์บน Linux ด้วยคำสั่ง PHP เช่น mkdir ซึ่งถึงแม้จะกำหนด Permission ในขั้นตอนการสร้างให้เป็น 0777 แล้ว แต่พอไปดูที่ Folder จริงจะไม่เป็นไปตามที่กำหนดอาจจะเห็นเป็น rwxr-xr-x หรือ 0755 นั่นเอง ปัญหาที่เกิดขึ้นนี้มักสร้างปัญหาในกรณีที่มีการสร้าง Folder ที่ใช้ร่วมกันในหลาย Server ซึ่งอาจทำให้ Server อื่นไม่สามารถเขียนไฟล์ทับ หรือเขียนลงใน Folder ได้นั่นเอง ปัญหานี้เกิดจากใน Linux จะมี umask ซึ่งเป้นเครื่องมือในการ mask permission ก่อนการเขียนไฟล์หรือโฟลเดอร์ใน Linux นั่นเอง ซึ่งเราสามารถดูได้ว่าปัจจุบัน umask ในเครื่องเป็นเท่าไรเพียงรันคำสั่ง umask ก็จะเห็น โดยส่วนใหญ่จะเป็น 022 ซึ่งเมื่อนำไป mask กับ 777 ก็จะได้เป็น 777 - 022 = 755 นั่นเอง วิธีการแก้ไขสามารถทำได้โดยก่อนสร้างไฟล์หรือโฟลเดอร์ให้ทำการเปลี่ยน umask ให้เป็น 0  แล้วจึงใช้คำสั่งเขียนไฟล์หรือโฟลเดอร์นั่นเอง เช่น


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
   $old = umask(0);
   chmod("/path/some_dir/some_file.txt", 0777);
   umask($old);

   // Checking
   if ($old != umask()) {
      die('An error occurred while changing back the umask');
   }
?>


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
   $old = umask(0);
   mkdir("/path/to/my/dir", 0777);
   umask($old);

   // Checking
   if ($old != umask()) {
      die('An error occurred while changing back the umask');
   }
?>

Comments

Popular posts from this blog

Serialize and Deserialize JSON data with C#

This post is about example for serialize and deserialize json data with C#. This example using Newtonsoft.Json to be a library to work with json data. You can add Newtonsoft.Json by download from  https://www.newtonsoft.com/json  or using Nuget to add it into your project. In this example is Bill object that hold billing data about Car object. Serialize Object to String Below is example code to serialize object to json string. At line 39 is code to convert object into json string with beautiful json format. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; namespace JSON { class JSonExample { static void Main( string [] args) { List<Car> cars = new List<Car>(); float to...

Make a scheduling job in Spring Boot

You can make a class to run as a schedule job in Spring Boot. By using @EnableSchedule in your project. Below is example code to enable schedule in Spring Boot. Declare Spring Boot application to support schedule By declare @EnableSchedule at the main class (see at line 10). This enables detection of @ Scheduled annotations on any Spring-managed bean in the container. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.myexample; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @SpringBootApplication @EnableScheduling public class MyExampleApplication { public static void main(String[] args) { SpringApplication.run(MyExampleApplication.class, args); } } Declare schedule configuration at...

Install Spring Boot application as a Windows services.

I using  WinSW  to be wrapper for Spring Boot application to run as a Windows service (following section 61.3 of Spring Boot document). There few easy step to setup. Download WinSW binary distribution from website  https://github.com/kohsuke/winsw/releases Copy WinSW.exe into Spring Boot application folder (ex: my file is WinSW.Net4.exe) Rename your WinSW.exe to same as your jar file (for easy to remember). Create XML file name same as jar file. This file is using for configuration of Windows services. Put configuration for services wrapper in your xml file. 1 2 3 4 5 6 7 8 9 <?xml version="1.0" encoding="UTF-8"?> <service> <id>my-application-0.0.1</id> <name>my-application-0.0.1</name> <description>My Exaple Spring Boot Services</description> <executable>java</executable> <arguments>-jar -Xmx1024M -Xms128M "my-application-0.0.1.jar"</arguments> <logmode>rotate...