记步工具类

news/2024/10/17 18:13:25/
package com.example.yanxu.todaysteps.util;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;/*** @ClassName: StepBootCompleteReceiver* @Description: 开机完成广播* @Author: yanxu5* @Date: 2019/8/19*/
public class StepBootCompleteReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction() != null && intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {try {Intent todayStepIntent = new Intent(context, StepService.class);todayStepIntent.putExtra(StepService.INTENT_BOOT_COMPLETED, true);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {context.startForegroundService(intent);} else {context.startService(todayStepIntent);}} catch (Exception e) {e.printStackTrace();}}}}
package com.example.yanxu.todaysteps.util;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.os.SystemClock;/*** @ClassName: StepCounter* @Description: Sensor.TYPE_STEP_COUNTER(Android 4.4以上) 通过计步传感器计算当天步数,不需要后台Service* @Author: yanxu5* @Date: 2019/8/19*/public class StepCounter implements SensorEventListener {private int sOffsetStep;private int sCurrStep;private String mTodayDate;private boolean mIsCleanStep;private boolean mIsShutdown;private boolean mIsCounterStepReset = true;//用来标识对象第一次创建private Context mContext;private boolean mIsSeparate;private boolean mIsBoot;public StepCounter(Context context, boolean separate, boolean boot) {mContext = context;mIsSeparate = separate;mIsBoot = boot;sCurrStep = (int) StepSPHelper.getCurrentStep(mContext);mIsCleanStep = StepSPHelper.getCleanStep(mContext);mTodayDate = StepSPHelper.getStepToday(mContext);sOffsetStep = (int) StepSPHelper.getStepOffset(mContext);mIsShutdown = StepSPHelper.getShutdown(mContext);boolean isShutdown = shutdownBySystemRunningTime();//开机启动监听到,一定是关机开机了if (mIsBoot || isShutdown || mIsShutdown) {mIsShutdown = true;StepSPHelper.setShutdown(mContext, true);}initBroadcastReceiver();dateChangeCleanStep();}private void initBroadcastReceiver() {final IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_TIME_TICK);filter.addAction(Intent.ACTION_TIME_CHANGED);filter.addAction(Intent.ACTION_DATE_CHANGED);BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(final Context context, final Intent intent) {if (Intent.ACTION_TIME_TICK.equals(intent.getAction())|| Intent.ACTION_TIME_CHANGED.equals(intent.getAction())|| Intent.ACTION_DATE_CHANGED.equals(intent.getAction())) {dateChangeCleanStep();//service存活做0点分隔}}};mContext.registerReceiver(mBatInfoReceiver, filter);}@Overridepublic void onSensorChanged(SensorEvent event) {if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {int counterStep = (int) event.values[0];if (mIsCleanStep) {cleanStep(counterStep);} else if (mIsShutdown || shutdownByCounterStep(counterStep)) {shutdown(counterStep);//处理关机启动}sCurrStep = counterStep - sOffsetStep;if (sCurrStep < 0) {cleanStep(counterStep);//容错处理,无论任何原因步数不能小于0,如果小于0,直接清零}StepSPHelper.setCurrentStep(mContext, sCurrStep);StepSPHelper.setElapsedRealTime(mContext, SystemClock.elapsedRealtime());StepSPHelper.setLastSensorStep(mContext, counterStep);dateChangeCleanStep();}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}private void cleanStep(int counterStep) {sCurrStep = 0;//清除步数,步数归零,优先级最高sOffsetStep = counterStep;StepSPHelper.setStepOffset(mContext, sOffsetStep);mIsCleanStep = false;StepSPHelper.setCleanStep(mContext, false);}private void shutdown(int counterStep) {int tmpCurrStep = (int) StepSPHelper.getCurrentStep(mContext);//重新设置offsetsOffsetStep = counterStep - tmpCurrStep;StepSPHelper.setStepOffset(mContext, sOffsetStep);mIsShutdown = false;StepSPHelper.setShutdown(mContext, false);}private boolean shutdownByCounterStep(int counterStep) {if (mIsCounterStepReset) {//只判断一次mIsCounterStepReset = false;//当前传感器步数小于上次传感器步数if (counterStep < StepSPHelper.getLastSensorStep(mContext)) {//当前传感器步数小于上次传感器步数肯定是重新启动了,只是用来增加精度不是绝对的return true;}}return false;}private boolean shutdownBySystemRunningTime() {//本地记录的时间,判断进行了关机操作if (StepSPHelper.getElapsedRealTime(mContext) > SystemClock.elapsedRealtime()) {//上次运行的时间大于当前运行时间判断为重启,只是增加精度,极端情况下连续重启,会判断不出来return true;}return false;}private synchronized void dateChangeCleanStep() {//时间改变了清零,或者0点分隔回调if (!getTodayDate().equals(mTodayDate) || mIsSeparate) {mIsCleanStep = true;StepSPHelper.setCleanStep(mContext, true);mTodayDate = getTodayDate();StepSPHelper.setStepToday(mContext, mTodayDate);mIsShutdown = false;StepSPHelper.setShutdown(mContext, false);mIsBoot = false;mIsSeparate = false;sCurrStep = 0;StepSPHelper.setCurrentStep(mContext, sCurrStep);}}private String getTodayDate() {return StepDateUtils.getCurrentDate("yyyy-MM-dd");}/*** 是否跨越零点、是否开机** @param separate* @param boot*/public void setZeroAndBoot(boolean separate, boolean boot) {mIsSeparate = separate;mIsBoot = boot;}}
package com.example.yanxu.todaysteps.util;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @ClassName: StepDateUtils* @Description: 时间工具类(时间格式转换工具类)* @Author: yanxu5* @Date: 2019/8/19*/
class StepDateUtils {private static ThreadLocal<SimpleDateFormat> SIMPLE_DATE_FORMAT = new ThreadLocal<>();private static SimpleDateFormat getDateFormat() {SimpleDateFormat df = SIMPLE_DATE_FORMAT.get();if (df == null) {df = new SimpleDateFormat();SIMPLE_DATE_FORMAT.set(df);}return df;}/*** 返回一定格式的当前时间** @param pattern "yyyy-MM-dd HH:mm:ss E"* @return String*/public static String getCurrentDate(String pattern) {getDateFormat().applyPattern(pattern);Date date = new Date(System.currentTimeMillis());return getDateFormat().format(date);}private static long getDateMillis(String dateString, String pattern) {long millionSeconds = 0;getDateFormat().applyPattern(pattern);try {millionSeconds = getDateFormat().parse(dateString).getTime();} catch (ParseException e) {e.printStackTrace();}// 毫秒return millionSeconds;}/*** 格式化输入的millis** @param millis  millis* @param pattern yyyy-MM-dd HH:mm:ss E* @return String*/private static String dateFormat(long millis, String pattern) {getDateFormat().applyPattern(pattern);Date date = new Date(millis);return getDateFormat().format(date);}/*** 将dateString原来old格式转换成new格式** @param dateString dateString* @param oldPattern yyyy-MM-dd HH:mm:ss E* @param newPattern newPattern* @return oldPattern和dateString形式不一样直接返回dateString*/private static String dateFormat(String dateString, String oldPattern, String newPattern) {long millis = getDateMillis(dateString, oldPattern);if (0 == millis) {return dateString;}return dateFormat(millis, newPattern);}}
package com.example.yanxu.todaysteps.util;import android.app.AlarmManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Build;
import android.os.IBinder;
import android.os.SystemClock;import java.util.Calendar;
import java.util.TimeZone;/*** @ClassName: StepService* @Description: 当日步数的Service* @Author: yanxu5* @Date: 2019/8/19*/
public class StepService extends Service {private static final int SAMPLING_PERIOD_US = SensorManager.SENSOR_DELAY_FASTEST; //传感器刷新频率public static final String INTENT_ALARM_0_SEPARATE = "intent_alarm_0_separate";public static final String INTENT_BOOT_COMPLETED = "intent_boot_completed";private SensorManager mSensorManager;private StepCounter mStepCounter; //Sensor.TYPE_STEP_COUNTER 计步传感器计算当天步数,不需要后台Serviceprivate boolean mIsSeparate = false;private boolean mIsBoot = false;private int alarmCount;@Overridepublic void onCreate() {super.onCreate();mSensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);initAlarm();//开启零点定时}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {startForeground(1, new Notification());}if (null != intent) {mIsSeparate = intent.getBooleanExtra(INTENT_ALARM_0_SEPARATE, false);mIsBoot = intent.getBooleanExtra(INTENT_BOOT_COMPLETED, false);}startStepDetector();//注册传感器return START_STICKY;}private void startStepDetector() {//android4.4以后如果有StepDetector可以使用计步传感器if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && getStepCounter()) {addStepCounterListener();} else {StepSPHelper.setSupportStep(this, false);}}/*** 是否带有计步传感器** @return 返回结果*/private boolean getStepCounter() {Sensor countSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);boolean isHaveStepCounter = getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_COUNTER);return null != countSensor && isHaveStepCounter;}private void addStepCounterListener() {StepSPHelper.setSupportStep(this, true);if (null != mStepCounter) {mStepCounter.setZeroAndBoot(mIsSeparate, mIsBoot);return;}Sensor countSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);mStepCounter = new StepCounter(getApplicationContext(), mIsSeparate, mIsBoot);mSensorManager.registerListener(mStepCounter, countSensor, SAMPLING_PERIOD_US);//注册监听}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic boolean onUnbind(Intent intent) {return super.onUnbind(intent);}@Overridepublic void onDestroy() {super.onDestroy();}/*** 定义一个零点闹钟*/public void initAlarm() {Intent intent = new Intent(this, StepZeroAlarmReceiver.class);intent.setAction("alarm_0_separate");PendingIntent pi = PendingIntent.getBroadcast(this, alarmCount++, intent, PendingIntent.FLAG_UPDATE_CURRENT);long firstTime = SystemClock.elapsedRealtime();//获取系统当前时间long systemTime = System.currentTimeMillis();//java.lang.System.currentTimeMillis(),它返回从UTC1970年1月1午夜开始经过的毫秒数。Calendar calendar = Calendar.getInstance();calendar.setTimeInMillis(System.currentTimeMillis());calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));//这里时区需要设置一下,不然会有8个小时的时间差calendar.set(Calendar.HOUR_OF_DAY, 0);//设置为8:00点提醒calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);calendar.set(Calendar.MILLISECOND, 0);//选择的定时时间long selectTime = calendar.getTimeInMillis();//计算出设定的时间//如果当前时间大于设置的时间,那么就从第二天的设定时间开始if (systemTime > selectTime) {calendar.add(Calendar.DAY_OF_MONTH, 1);selectTime = calendar.getTimeInMillis();}long time = selectTime - systemTime;//计算现在时间到设定时间的时间差long alarmTime = firstTime + time;//系统当前的时间+时间差// 进行闹铃注册AlarmManager am = (AlarmManager) this.getSystemService(ALARM_SERVICE);if (am != null) {am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, alarmTime, AlarmManager.INTERVAL_DAY, pi);}}}
package com.example.yanxu.todaysteps.util;import android.content.Context;
import android.content.SharedPreferences;import java.util.Map;/*** @ClassName: StepSharedPreferencesUtil* @Description: SP存储工具类* @Author: yanxu5* @Date: 2019/8/19*/public class StepSharedPreferencesUtil {// 保存在本地的文件名public static final String FILE_NAME = "step_shared_data";/*** 保存数据,根据获取到的数据的具体类型调用不同的保存方法** @param context 上下文环境* @param key     键值* @param object  保存对象(支持类型:String, Integer, Boolean, Float, Long)*/public static void setParam(Context context, String key, Object object) {SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);SharedPreferences.Editor editor = sp.edit();if (object instanceof String) {editor.putString(key, (String) object);} else if (object instanceof Integer) {editor.putInt(key, (Integer) object);} else if (object instanceof Boolean) {editor.putBoolean(key, (Boolean) object);} else if (object instanceof Float) {editor.putFloat(key, (Float) object);} else if (object instanceof Long) {editor.putLong(key, (Long) object);} else {editor.putString(key, object.toString());}editor.apply();}/*** 获取数据,根据默认值得到保存的数据的具体类型,调用相对应的方法获取值** @param context       上下文环境* @param key           键值* @param defaultObject 当从本地没有取到值时返回的默认值(支持类型:String, Integer, Boolean, Float, Long)* @return Object*/public static Object getParam(Context context, String key, Object defaultObject) {try {SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);if (defaultObject instanceof String) {return sp.getString(key, (String) defaultObject);} else if (defaultObject instanceof Integer) {return sp.getInt(key, (Integer) defaultObject);} else if (defaultObject instanceof Boolean) {return sp.getBoolean(key, (Boolean) defaultObject);} else if (defaultObject instanceof Float) {return sp.getFloat(key, (Float) defaultObject);} else if (defaultObject instanceof Long) {return sp.getLong(key, (Long) defaultObject);}return null;} catch (Exception e) {e.printStackTrace();return null;}}/*** 移除指定key对应的值** @param context* @param key*/public static void remove(Context context, String key) {SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);SharedPreferences.Editor editor = sp.edit();editor.remove(key);editor.apply();}/*** 清除所有数据** @param context*/public static void clear(Context context) {SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);SharedPreferences.Editor editor = sp.edit();editor.clear();editor.apply();}/*** 查询某个key是否已经存在** @param context* @param key* @return*/public static boolean contains(Context context, String key) {SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);return sp.contains(key);}/*** 返回所有的键值对** @param context* @return*/public static Map<String, ?> getAll(Context context) {SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);return sp.getAll();}
}
package com.example.yanxu.todaysteps.util;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;/*** @ClassName: StepShutdownReceiver* @Description: 关机广播* @Author: yanxu5* @Date: 2019/8/19*/
public class StepShutdownReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction() != null && intent.getAction().equals(Intent.ACTION_SHUTDOWN)) {StepSPHelper.setShutdown(context, true);}}}
package com.example.yanxu.todaysteps.util;import android.content.Context;/*** @ClassName: StepSPHelper* @Description: SharedPreferences工具类* @Author: yanxu5* @Date: 2019/8/19*/
public class StepSPHelper {// 上一次计步器的步数private static final String LAST_SENSOR_TIME = "last_sensor_time";// 步数补偿数值,每次传感器返回的步数-offset=当前步数private static final String STEP_OFFSET = "step_offset";// 当天,用来判断是否跨天private static final String STEP_TODAY = "step_today";// 清除步数private static final String CLEAN_STEP = "clean_step";// 当前步数private static final String CURR_STEP = "curr_step";// 手机关机监听private static final String SHUTDOWN = "shutdown";// 系统运行时间private static final String ELAPSED_REAL_TIME = "elapsed_real_time";// 是否支持计步功能private static final String IS_SUPPORT_STEP = "is_support_step";/*** 保存上一次计步器的步数** @param context        上下文* @param lastSensorStep 上一次步数*/protected static void setLastSensorStep(Context context, float lastSensorStep) {StepSharedPreferencesUtil.setParam(context, LAST_SENSOR_TIME, lastSensorStep);}/*** 读取上一次计步器的步数** @param context 上下文* @return 上一次计步器的步数*/protected static float getLastSensorStep(Context context) {return (float) StepSharedPreferencesUtil.getParam(context, LAST_SENSOR_TIME, 0.0f);}/*** 保存步数补偿数值** @param context    上下文* @param stepOffset 补偿数值*/protected static void setStepOffset(Context context, float stepOffset) {StepSharedPreferencesUtil.setParam(context, STEP_OFFSET, stepOffset);}/*** 读取步数补偿数值** @param context 上下文* @return 补偿数值*/protected static float getStepOffset(Context context) {return (float) StepSharedPreferencesUtil.getParam(context, STEP_OFFSET, 0.0f);}/*** 保存当天日期** @param context   上下文* @param stepToday 当天日期*/protected static void setStepToday(Context context, String stepToday) {StepSharedPreferencesUtil.setParam(context, STEP_TODAY, stepToday);}/*** 读取当天日期** @param context 上下文* @return 当天日期*/protected static String getStepToday(Context context) {return (String) StepSharedPreferencesUtil.getParam(context, STEP_TODAY, "");}/*** 保存是否清楚步数 true清除步数从0开始,false否** @param context   context* @param cleanStep cleanStep*/protected static void setCleanStep(Context context, boolean cleanStep) {StepSharedPreferencesUtil.setParam(context, CLEAN_STEP, cleanStep);}/*** 保存是否清楚步数 true清除步数,false否** @param context context* @return boolean*/protected static boolean getCleanStep(Context context) {return (boolean) StepSharedPreferencesUtil.getParam(context, CLEAN_STEP, true);}/*** 保存当前步数** @param context  上下文* @param currStep 当前步数*/protected static void setCurrentStep(Context context, float currStep) {StepSharedPreferencesUtil.setParam(context, CURR_STEP, currStep);}/*** 读取当前步数** @param context 上下文* @return 当前步数*/protected static float getCurrentStep(Context context) {return (float) StepSharedPreferencesUtil.getParam(context, CURR_STEP, 0.0f);}/*** 保存是否关机** @param context  上下文* @param shutdown 是否关机*/protected static void setShutdown(Context context, boolean shutdown) {StepSharedPreferencesUtil.setParam(context, SHUTDOWN, shutdown);}/*** 读取是否关机** @param context 上下文* @return 是否关机*/protected static boolean getShutdown(Context context) {return (boolean) StepSharedPreferencesUtil.getParam(context, SHUTDOWN, false);}/*** 保存系统运行时间** @param context         上下文* @param elapsedRealTime 系统运行时间*/protected static void setElapsedRealTime(Context context, long elapsedRealTime) {StepSharedPreferencesUtil.setParam(context, ELAPSED_REAL_TIME, elapsedRealTime);}/*** 读取系统运行时间** @param context 上下文* @return 系统运行时间*/protected static long getElapsedRealTime(Context context) {return (long) StepSharedPreferencesUtil.getParam(context, ELAPSED_REAL_TIME, 0L);}/*** 保存是否支持计步** @param context       上下文* @param isSupportStep 是否支持计步*/protected static void setSupportStep(Context context, boolean isSupportStep) {StepSharedPreferencesUtil.setParam(context, IS_SUPPORT_STEP, isSupportStep);}/*** 读取是否支持计步** @param context 上下文* @return 是否支持计步*/protected static boolean getSupportStep(Context context) {return (boolean) StepSharedPreferencesUtil.getParam(context, IS_SUPPORT_STEP, false);}}
package com.example.yanxu.todaysteps.util;import android.content.Context;/*** @ClassName: StepUtil* @Description: 计步相关的工具类* @Author: yanxu5* @Date: 2019/9/10*/
public class StepUtil {/*** 是否支持计步** @param context 上下文* @return 是否支持计步*/public static boolean isSupportStep(Context context) {return StepSPHelper.getSupportStep(context);}/*** 今日步数(每日有效步数30000步-->服务端处理)** @param context 上下文* @return 今日步数*/public static int getTodayStep(Context context) {return (int) StepSPHelper.getCurrentStep(context);}}
package com.example.yanxu.todaysteps.util;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;/*** @ClassName: StepZeroAlarmReceiver* @Description: 零点的定时广播* @Author: yanxu5* @Date: 2019/8/23*/
public class StepZeroAlarmReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction() != null && intent.getAction().equals("alarm_0_separate")) {Intent todayStepIntent = new Intent(context, StepService.class);todayStepIntent.putExtra(StepService.INTENT_ALARM_0_SEPARATE, true);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {context.startForegroundService(intent);} else {context.startService(todayStepIntent);}}}}

最后main  

package com.example.yanxu.todaysteps.activity;import android.content.Intent;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import com.example.yanxu.todaysteps.R;
import com.example.yanxu.todaysteps.util.StepUtil;
import com.example.yanxu.todaysteps.util.StepService;public class MainActivity extends AppCompatActivity {private TextView mTvSteps;private Button mBtRefresh;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initStepService();initView();initData();}/*** 初始化计步服务* 注:因初始化需要过程,正常项目中,初始化应该放在进入到主界面之前的activity中,比如闪屏页中进行初始化* 因此本demo在第一次安装时会提示"手机暂不支持计步功能",杀死进程再次打开即可正常显示*/private void initStepService() {Intent intent = new Intent(this, StepService.class);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {startForegroundService(intent);} else {startService(intent);}}/*** 初始化view*/private void initView() {mTvSteps = findViewById(R.id.tv_steps);mBtRefresh = findViewById(R.id.bt_refresh);}/*** 初始化数据*/private void initData() {if (!StepUtil.isSupportStep(this)) {mTvSteps.setText("手机暂不支持计步功能");return;}mBtRefresh.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String steps = StepUtil.getTodayStep(MainActivity.this) + "步";mTvSteps.setText(steps);}});}}

http://www.ppmy.cn/news/429092.html

相关文章

android系统使用crontab定时任务

一、先决条件 必须root&#xff0c;root才能在system目录配置文件安装busybox包&#xff0c;busybox是一个linux命令的工具包 二、激活init.d init.d在linux系统里面是负责管理系统启动以后自动执行的一些脚本的&#xff0c;必须把启动cron服务的脚本写在里面&#xff0c;这样…

Liunx数据备份与定时执行

Liunx数据备份与定时执行 一、编写脚本 1 创建脚本 touch test-bak.sh 2 写入命令 #! /bin/bash #创建一个临时文件夹 mkdir /root/beifen #将需要备份的文件复制到临时文件夹下 cp -r /root/backup /root/beifen #将beifen文件夹打包 tar -zcPvf /root/backup$(date %Y%m…

Linux学习之定时任务调度cron/crontab

概述 crontab为Linux下的计划任务程序&#xff0c;对应的服务为crond。crond是一个守护进程&#xff0c;每分钟会定期检查是否有要执行的任务&#xff0c;如果有要执行的任务&#xff0c;则自动执行该任务。Linux系统上面原本就有非常多的计划性工作&#xff0c;故而&#xff…

Linux系统管理之定时任务

at定时任务 确定 at 安装 chkconfig --list |grep atd 检查 at 服务是否安装 service atd restart 启动atd服务&#xff1b; 很多服务 例如 httpd &#xff0c;d是deamon 守护进程的意思&#xff0c;将这个程序当做系统的服务运行在系统的后台&#xff1b; at的访问控制 /et…

CentOS7 定时任务

在计算机的使用过程中&#xff0c;经常会有一些计划中的任务需要在将来的某个时间执行&#xff0c;linux中提供了一些方法来设定定时任务。 1、at 命令at从文件或标准输入中读取命令并在将来的一个时间执行&#xff0c;只执行一次。at的正常执行需要有守护进程atd(关于systemc…

linux定时关闭系统at,『学了就忘』Linux系统管理 — 8.系统定时任务(at命令)

定时任务是在服务器上常用到的一个工作。 在你指定的时间&#xff0c;系统会自动执行你指定的程序(脚本或者命令)。 Linxu系统中的定时任务不难&#xff0c;关键是如何写出正确的脚本。 在Linxu系统中&#xff0c;有三种用于任务调度的工具 at命令调用atd服务 crontab命令调用c…

完美替代Windows任务计划程序 —— 定时执行专家

关于Windows的任务计划程序和Linux的Cron 在执行Windows的某些IT任务时&#xff0c;熟悉IT的人一般都会想到Windows任务计划程序&#xff0c;这个是Windows自带的一款任务计划软件。当我们真正尝试使用它在计划上运行批处理文件等任务时会遇到很多问题和限制&#xff0c;它不仅…